当前位置: 首页 > news >正文

8088单板机接口扩展实验(二)LCD1602

1.硬件

2.程序

#define IO1 0x0600 #define IO2 0x0400 #define IO3 0x0600 #define ADR_244 IO3 //LCD Registers addresses #define LCD_CMD_WR (IO1+0x00) #define LCD_DATA_WR (IO1+0x02) #define LCD_BUSY_RD (IO1+0x04) #define LCD_DATA_RD (IO1+0x06) /* 可编程定时/计数器接口8253A */ #define ADR_TIMER_CONTROL (IO2 + 0x06) #define ADR_TIMER_DATA0 (IO2 + 0x00) #define ADR_TIMER_DATA1 (IO2 + 0x02) #define ADR_TIMER_DATA2 (IO2 + 0x04) #define TIMER_COUNTER0 0x00 #define TIMER_COUNTER1 0x40 #define TIMER_COUNTER2 0x80 #define TIMER_LATCH 0x00 #define TIMER_LSB 0x10 #define TIMER_MSB 0x20 #define TIMER_LSB_MSB 0x30 #define TIMER_MODE0 0x00 #define TIMER_MODE1 0x02 #define TIMER_MODE2 0x04 #define TIMER_MODE3 0x06 #define TIMER_MODE4 0x08 #define TIMER_MODE5 0x09 #define TIMER_BCD 0x01 unsigned char Str1[]=" Current Time"; unsigned char Str2[]="Set "; unsigned char HMS_String[]=" 12:30:00 "; unsigned char Hour=12,Minute=30,Second=0; unsigned char Settime; unsigned char Change_H_or_M=1; void outp(unsigned int addr, char data) // 输出一字节到I/O端口 { __asm { mov dx, addr mov al, data out dx, al } } char inp(unsigned int addr) // 从I/O端口输入一字节 { char result; __asm { mov dx, addr in al, dx mov result, al } return result; } //设置中断失量表 void set_int(unsigned char int_no, void * service_proc) { _asm { push es xor ax, ax mov es, ax mov al, int_no xor ah, ah shl ax, 1 shl ax, 1 mov si, ax mov ax, service_proc mov es:[si], ax inc si inc si mov bx, cs mov es:[si], bx pop es } } //中断处理函数 /* void _interrupt _far nmi_handler(void) { if(++Second==60) { Second=0; if(++Minute==60) { Minute=0; if(++Hour==24) { Hour=0;Minute=0;Second=0; } } } } void setup_nmi(void) // 在中断失量表添加2号中断失量 { set_int(0x02, (void *)&nmi_handler); // 设置8253A定时/计数器 outp(ADR_TIMER_CONTROL, TIMER_COUNTER0 | TIMER_MODE3 | TIMER_LSB_MSB|TIMER_BCD); outp(ADR_TIMER_DATA0, 0x00); outp(ADR_TIMER_DATA0, 0x01); outp(ADR_TIMER_CONTROL, TIMER_COUNTER2 | TIMER_MODE2 | TIMER_LSB_MSB|TIMER_BCD); outp(ADR_TIMER_DATA2, 0x00); outp(ADR_TIMER_DATA2, 0x10); } */ //LCD忙等待 void WaitForEnable( void ) { unsigned char result; do{ result=inp(LCD_BUSY_RD); }while(result&0x80); } //LCD写命令 void LcdWriteCommand( unsigned char cmd) { WaitForEnable(); outp(LCD_CMD_WR,cmd); } //LCD写数据 void LcdWriteData( char data ) { WaitForEnable(); outp(LCD_DATA_WR,data); } void LcdReset( void ) { LcdWriteCommand( 0x38); LcdWriteCommand( 0x0c); LcdWriteCommand( 0x06); LcdWriteCommand( 0x01); } void lcd_pos(unsigned char pos) { LcdWriteCommand( pos|0x80); } void lcd_out(unsigned char *row) { unsigned char *p; p=row; while(*p!='\0') { LcdWriteData(*p); p++; } } void delay(unsigned int x) {unsigned char i; while(x--) {for(i=0; i<120;i++){}} } //时分秒转换为字符串 void hms_str(unsigned char h,unsigned char m,unsigned char s) { HMS_String[4]=h/10+'0'; HMS_String[5]=h%10+'0'; HMS_String[7]=m/10+'0'; HMS_String[8]=m%10+'0'; HMS_String[10]=s/10+'0'; HMS_String[11]=s%10+'0'; } //调整时间 void Change_Time() { Settime=0; if(inp(ADR_244)!=0x0f) { lcd_pos(0x00); lcd_out(Str2); Settime=1; } while(Settime) { if(!(inp(ADR_244)&0x01)) { while(!(inp(ADR_244)&0x01)){} Change_H_or_M=!Change_H_or_M; if(!Change_H_or_M) {Str2[4]=' ';Str2[5]=' ';Str2[7]='<';Str2[8]='>';} else {Str2[4]='<';Str2[5]='>';Str2[7]=' ';Str2[8]=' ';} lcd_pos(0x00);lcd_out(Str2); } if(!(inp(ADR_244)&0x02)) { while(!(inp(ADR_244)&0x02)){} if(Change_H_or_M==1) {if(++Hour==24)Hour=0;} else {if(++Minute==60)Minute=0;} } if(!(inp(ADR_244)&0x04)) { while(!(inp(ADR_244)&0x04)){} if(Change_H_or_M==1) {if(--Hour==0xff)Hour=23;} else {if(--Minute==0xff)Minute=59;} } if(!(inp(ADR_244)&0x08)) { while(!(inp(ADR_244)&0x08)){} lcd_pos(0x00); lcd_out(Str1); Settime=0; } hms_str(Hour,Minute,Second); lcd_pos(0x40); lcd_out(HMS_String); } } void main(void) { // setup_nmi(); LcdReset(); lcd_pos(0x00); lcd_out(Str1); lcd_pos(0x40); lcd_out(HMS_String); while(1) { //hms_str(Hour,Minute,Second); lcd_pos(0x40); lcd_out(HMS_String); outp(0x800,0xff); delay(100); // LcdReset(); lcd_pos(0x00); lcd_out(Str1); outp(0x800,0x00); delay(100); outp(0x600,0xff); delay(100); //Change_Time(); } } char end_flag[5]={0x55,0x55,0x55,0x55,0x55};

3.测试

http://www.jsqmd.com/news/859479/

相关文章:

  • CentOS 7 安装 Lets Encrypt 证书失败提示授权失败怎么办
  • 排查UEFI启动时出现两个GOP Handle?手把手教你用Device Path定位真实显卡
  • 派网Panabit AP上线踩坑实录:华为交换机上配了Option 138,为什么AP还是找不到AC?
  • 【限时解禁】Midjourney官方未文档化的--sepia--与--chroma-shift--双引擎分离协议,实测提升色彩独立性达63.8%
  • 这种只有ISSN号没有CN号的期刊是否靠谱,能投吗?
  • GB35114客户端开发实战:手把手教你用eXosip2搞定SIP注册与SM2国密认证
  • 5步掌握YOLOv8 AI自瞄:从零到实战的完整指南
  • Winhance中文版:5分钟让你的Windows系统飞起来!
  • 将路径加入环境变量 PATH:可忽视路径直接运行程序(hadoop version)
  • 企业用车公司在线预约品牌该怎么选看这几点 - 资讯速览
  • OOTDiffusion终极指南:快速掌握AI虚拟试衣技术
  • A2L文件里的CHARACTERISTIC和MEASUREMENT到底有啥区别?从Simulink代码生成角度一次讲清
  • 知识库上传成功但检索不到内容:从向量入库静默失败到多层补偿的排查路径
  • 如何快速配置PeaZip:面向初学者的完全免费压缩文件管理器终极指南
  • 从GLIBCXX报错聊起:你的Anaconda虚拟环境真的‘独立’吗?一份避坑指南
  • ElevenLabs湖南话语音合规性白皮书:通过广电总局语音内容安全检测的5项技术验证(含方言情感倾向过滤方案)
  • 从Java到AI大模型:新手程序员必备的转型指南(收藏版)
  • Python串口批量产测工具:自动化Linux设备测试与配置
  • GetQzonehistory终极教程:3步免费备份QQ空间所有历史记录
  • B站视频下载难题的终结者:BiliDownload如何用3个简单步骤帮你获取无水印高清视频
  • 免费网盘直链解析神器:5分钟告别下载限速
  • 警惕鬼秤!成都 3 家黄金回收实测,5.21 计价公开不玩猫腻 - 资讯快报
  • 充电桩控制板技术演进:从硬件选型到软件架构的实战解析
  • Sunshine游戏串流终极指南:5个步骤打造你的私人云游戏平台
  • AI 智能体开发与上线
  • 北京朱雀智能获客重磅升级:三大系统 + 百城基地,重构企业增长新范式 - 品牌企业推荐师(官方)
  • 2026西南护栏网市场分析:四川口碑比较好的优质企业推荐榜 - 深度智识库
  • CANopen协议栈代码里挖出的“坑”:SYNC使能位和NMT状态机,你的理解可能一直是错的
  • 2026年北京大数据精准获客服务商选型指南|SDK+DPI双技术驱动的B端增长破局 - 企业名录优选推荐
  • 外部表(EXTERNAL_TABLE)Hive 借用数据,删表不删数据