第83节:矩阵键盘输入任意数字或小数点的液晶屏显示程序
本来这节打算讲调用液晶屏内部字库时让某行内容反显的,但是在昨天调试过程中,发现一个很奇怪的问题,当调用内部字库时,按照数据手册,我执行一条反显指令时,应该是仅仅某一行反显,但是却同时出现两行反显。比如,当我执行
WriteCommand(0x34); //扩充指令集
WriteCommand(0x04); //第1行反显
指令时,发现第一行和第三行反显,后来想想,我猜测这种12864的屏应该是25632折成左右半屏,左半屏在上面,右半屏在下面。经过这次经验,我觉得大家以后尽量不要用液晶屏的内部字库模式,应该用自构字库的模式(图形模式)。因为我觉得用内部字库模式的时候,这个集成的反显扩展指令不好用。而用自构字库的模式(图形模式),却可以顺心所欲的灵活运用,适合做菜单程序。
既然发现内部字库不好用,所以不再讲内部字库模式,这节仅仅接着前面第79节内容,继续讲在自构字库的模式(图形模式)下,如何通过矩阵键盘直接输入数字和小数点,就像普通的计算器一样键盘输入。这个功能表面简单,其实有以下四个地方值得注意:
第一:如何用数组接收按键输入的BCD码数据。
第二:如何限制输入参数的小数点个数和数组的有效个数。
第三:如果第0个位置是0,那么继续输入的数据直接覆盖0,否则就移位再输入。
第四:如果第0个位置是0,那么继续输入的小数点要移位输入。
要仔细了解以上提到的关键点,必须好好研究本程序中的void set_data(…)函数。同时也要温习一下之前讲的自构字库模式的液晶屏显示内容,尤其是插入画布显示的内容。
具体内容,请看源代码讲解。
(1) 硬件平台:
基于朱兆祺51单片机学习板。数字1键对应S1键,数字2键对应S2键,数字3键对应S3键…. 数字9键对应S9键, 数字0键对应S10键。小数键对应S11,清零键对应S16,其它按键不用。
(2) 实现功能:
用矩阵键盘输入任意数字或小数点。小数点不能超过2位,一旦超过2位,再按其它按键则输入无效。有效数字也不能超过6位(包括小数点),一旦超过6位,再按其它按键则输入无效。
想重新输入,必须按S16清零按键才能重新输入。
(3)源代码讲解如下:
- #include "REG52.H"
- #define const_voice_short40 //蜂鸣器短叫的持续时间
- #define const_key_time10 //按键去抖动延时的时间
- sbit key_sr1=P0^0; //第一行输入
- sbit key_sr2=P0^1; //第二行输入
- sbit key_sr3=P0^2; //第三行输入
- sbit key_sr4=P0^3; //第四行输入
- sbit key_dr1=P0^4; //第一列输出
- sbit key_dr2=P0^5; //第二列输出
- sbit key_dr3=P0^6; //第三列输出
- sbit key_dr4=P0^7; //第四列输出
- sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
- sbitLCDCS_dr= P1^6;//片选线
- sbitLCDSID_dr = P1^7;//串行数据线
- sbitLCDCLK_dr = P3^2;//串行时钟线
- sbitLCDRST_dr = P3^4;//复位线
- void SendByteToLcd(unsigned char ucData);//发送一个字节数据到液晶模块
- void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
- void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块
- void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块
- void LCDInit(void);//初始化函数内部包括液晶模块的复位
- void display_clear(unsigned char ucFillDate); // 清屏 全部显示空填充0x00 全部显示点阵用0xff
- void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount);//把字模插入画布.
- void display_lattice(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr); //显示任意点阵函数
- unsigned char *number_to_matrix(unsigned charucBitNumber); //把一位数字转换成字模首地址的函数
- void delay_short(unsigned int uiDelayshort); //延时
- void delay_long(unsigned int uiDelayLong);
- void key_number_input(unsigned char ucKeyNumber); //输入数字按键
- void set_data(unsigned char ucKeyNumberTemp,unsigned char ucDotBitMax,unsigned char ucDataCntMax,unsigned char *p_ucDotCnt,unsigned char *p_ucDotBitS,unsigned char *p_ucWdPartCnt,unsigned char *p_ucSetDataBuffer);
- void key_delete_input(void); //删除按键
- void T0_time(); //定时中断函数
- void key_service();
- v
矩阵键盘输入任意数字液晶屏显示程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)