1单片机与HD7279的子程序
- 格式:doc
- 大小:43.50 KB
- 文档页数:29
单片机课程设计报告题目:万年历学年:2010-2011 学期:第一学期专业:通信工程班级:通信081学号:08010*** 姓名:***指导教师:****时间:第二周~ 第四周地点:10404浙江万里学院电子信息学院一、设计任务:设计一个万年历,主要以单片机和芯片7279为硬件基础,载入用C语言编写的程序,设计出功能完善的万年历。
该万年历通过按键可切换显示时间与日期;能自动准确的计时;能通过判断年份和月份来显示相应的天数(即能判断闰年,大月和小月)。
且能通过不同的按键调整时间和日期。
二、设计说明书:1)模块划分:1、显示模块利用7279芯片来控制数码管的显示。
通过7279芯片的其中一条指令来让数码管对应的位置显示对应的数字。
本程序采用方式0译码。
在主程序中进行。
2、切换模块主要靠按键来切换显示时间和日期,采用中断方式来进行。
3、计时模块本程序采用定时计数器T0,定时50ms,即50ms进一次中断,20次后达到1秒,秒位加一,达到60秒后分位加一,一次类推周而复始的进行计数。
该模块也是采用中断方式进行采用11.0592M的晶振。
4、校时模块该模块也是通过按键来对时间和日期进行校时。
先通过一个按键来选择要校时的部分,再通过另外两个按键来对该部分进行加减,调整到正确的时间和日期。
日期在校时过程中还要对年份和月份进行判断是不是闰年,是大月还是小月。
进过判断后来显示相应的日期。
上述计时过程中也要进行判断。
该模块也采用中断方式。
2)变量列表:char digit[2][8] 利用二维数组变量记录数码管显示的数字unsigned char key_number 用来表示按键的键码unsigned char i=0; 用来记录进入中断的次数,同时也用来控制循环次数unsigned int tmr;unsigned char j;用来控制循环次数unsigned char a ; a来表示调用第几个数码管unsigned char flag1=0 ; flag1表示调节时间或日期的哪一位unsigned char flag=0 ; flag表示时间和日期变化标志,0时显示时间,1时显示日期3)子程序列表:void long_delay(void); // 长延时void short_delay(void); // 短暂延时void delay10ms(unsigned char); // 延时10MSvoid write7279(unsigned char, unsigned char); //把命令和数据写入到HD7279unsigned char read7279(unsigned char); // 从HD7279中读出数据void send_byte(unsigned char); // 发送一个字节unsigned char receive_byte(void); // 接收一个字节void t0() interrupt 1{} 定时计数,用于时间和日期的计数void intt1() interrupt 2 {} 切换功能,选择功能和校时功能的实现4)流程图:三、使用说明书:打开电源,显示时间。
浙江万里学院电信学院课程设计报告课程名称:单片机课程设计设计内容:万年历实验时间:2010年9月实验地点:10404专业班级:通信081姓名:*****学号:**********指导老师:*****2010年9 月28 日1、1数字万年历产生的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。
、1、2数字万年历的意义万年历是采用数字电路实现对年、月、日,时、分、秒,数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
//HD7279键盘程序#include "msp430g2452.h"#include "HD7279.h"static void delay_us(uint16 n) //N us延时函数{for(; n>0; n--);}void HD7279_Init(void){//HD7279_DIR |= HD7279_CS + HD7279_CLK + HD7279_DATA;HD7279_DIR |= HD7279_CLK + HD7279_DATA;HD7279_DIR &= ~HD7279_KEY;HD7279_IES |= HD7279_KEY; // 下降沿触发方式HD7279_IFG &= ~HD7279_KEY; // 清空中断标志HD7279_IE |= HD7279_KEY; // 使能KEY 中断//SendByte(0xA4); //清除缓存指令}/***发送一个字节的数据***/void SendByte(uint8 byte){uint8 i;HD7279_DIR |= HD7279_DA TA;HD7279_CLK_0;//HD7279_CS_0;delay_us(40);for (i=0;i<8;i++){if (byte&0x80)HD7279_DA TA_1;elseHD7279_DA TA_0;delay_us(1);HD7279_CLK_1;delay_us(12);HD7279_CLK_0;delay_us(12);byte = byte<<1;}HD7279_DATA_0;//HD7279_CS_1;}/***接收一个字节的数据***/uint8 ReceiveByte(void){uint8 i, state, out_byte;HD7279_CLK_0;HD7279_DIR &= ~HD7279_DATA;//HD7279_CS_0;delay_us(40);for (i=0;i<8;i++){HD7279_CLK_1;delay_us(12);out_byte=out_byte<<1;state = HD7279_IN & HD7279_DA TA;if (state == HD7279_DATA){out_byte=out_byte|0x01;}HD7279_CLK_0;delay_us(12);}//HD7279_CS_1;return (out_byte);}//写带数据的指令void write_7279(uint8 cmd, uint8 dat){SendByte(cmd);SendByte(dat);}uint8 read_7279(void){SendByte(0x15); // 发送读命令return (ReceiveByte());}/*void HD7279_disp(unsigned int disp_data){unsigned char shiwan,wan,qian,bai,shi,ge;unsigned int temp;temp = disp_data;shiwan = temp/100000;wan = temp%100000/10000;qian = temp%100000%10000/1000;bai = temp%100000%10000%1000/100;shi = temp%100000%10000%1000%100/10;ge = temp%100000%10000%1000%100%10;write_7279(0x80,ge);write_7279(0x81,shi);write_7279(0x82,bai);write_7279(0x83,qian);write_7279(0x84,wan);write_7279(0x85,shiwan);}*/uint8 Get_7279_KeyData(void){uint8 key_data, key_value;key_data = read_7279();if ((key_data < 8) && (key_data > 3))key_value = 8 - key_data;else if ((key_data < 16) && (key_data > 11))key_value = 20 - key_data;else if ((key_data < 24) && (key_data > 19))key_value = 32 - key_data;else if ((key_data < 32) && (key_data > 27))key_value = 44 - key_data;elsekey_value = 0;return (key_value);}//12864程序#include "msp430g2452.h"#include "12864.h"static void delay(uint16 t){unsigned int i,j;for(i=0; i<t; i++)for(j=0; j<14; j++);}void sendbyte(uint8 zdata){uint8 i;for(i=0; i<8; i++){if((zdata << i) & 0x80)SID_1;elseSID_0;SCLK_0;SCLK_1;}}void write_com(uint8 cmdcode){//CS_1;sendbyte(0xf8);sendbyte(cmdcode & 0xf0);sendbyte((cmdcode << 4) & 0xf0);delay(2);}void write_data(uint8 Dispdata){//CS_1;sendbyte(0xfa);sendbyte(Dispdata & 0xf0);sendbyte((Dispdata << 4) & 0xf0);delay(2);}void LCD_Init(void){LCD_DIR |= (LCD_SID + LCD_SCK);delay(2000);write_com(0x30);delay(50);write_com(0x0c);delay(50);write_com(0x01);//清屏delay(50);write_com(0x06);//00000110); //光标右移//06 delay(100);}void LCD_SetPosition(uint8 x,uint8 y){uint8 pos;if(x == 0)x = 0x80;else if(x == 1)x = 0x90;else if(x == 2)x = 0x88;else if(x == 3)x = 0x98;pos = x + y;write_com(pos);//显示地址}void LCD_DisplayString(uint8 *s){while(*s > 0){write_data(*s);s++;delay(50);}}void LCD_DisplayNumber(uint32 num, uint8 len){uint8 wei[10];uint8 i;uint8 flag = 0;for (i = 0; i < len; i++){wei[i] = num%10;num = num/10;}for (i = len; i > 0; i--){if ((wei[i-1] == 0) && (flag == 0) && (i > 1))write_data(' ');else if(wei[i-1] != 0)flag = 1;if (flag)write_data(wei[i-1]+0x30);}if (flag == 0)write_data('0');}void LCD_DisplayXiaoshu(uint32 num, uint8 len) {uint8 wei[10];uint8 i;for (i = 0; i < len; i++){wei[i] = num%10;num = num/10;}write_data('.');for (i = len; i > 0; i--){write_data(wei[i-1]+0x30);}}。
1 1 0 0 0 0 0 0 X X d5 d4 d3 d2 d1 d0XX:无影响。
该指令的作用是关闭某个数码管中的某一段,其对应关系同段点亮指令。
3读取键盘指令:0 0 0 1 0 1 0 1 d7 d6 d5 d4 d3 d2 d1 d0该指令的作用是读取当前的键盘代码。
与其他带数据的指令不同,它的第2个字节不是写入HD7279A 的数据,而是从HD7279A读回的按键代码。
如前说述,当有键按下时其围是00H~3FH;而无键按下时代码是FFH。
四、时序(1)纯指令时序:微处理器发出8个CLK脉冲,向HD7279A传送8位指令。
DATA引脚为高阻状态,如图2所示。
图2 纯指令时序(2)带数据指令时序:微处理器发出16个CLK脉冲,前8个向HD7279A传送8位指令;后8个向HD7279A传送8位数据。
DATA引脚为高阻状态,如图3所示。
图3 带数据指令时序(3)读键盘指令时序:微处理器发出16个CLK脉冲,前8个向HD7279A传送8位指令, DATA引脚为高阻状态;后8个由HD7279A向微处理器返回8位按键代码,DATA引脚为输出状态。
在最后1个CLK脉冲的下降沿DATA引脚恢复高阻状态,如图4所示。
图4读键盘指令时序五、几点说明1证正确的时序是HD7279A正常工作的前提条件。
当选定了HD7279A的振荡元件RC和晶振之后,应调节延时时间,使时序中的T1~T8满足表2所列要求。
由表2所列的数值可知,HD7279A时序规定的时间围很宽,达10~50倍,很容易满足,但为了提高微处理器访问HD7279A的速度,在要求系统运行速度较快时,应仔细调试HD7279A的读写程序,使其运行时间接近最短。
2 微处理器通过KEY引脚电平来判断是否有键按下,在使用查询方式管理键盘时,该引脚接至微处理器的1位I/O端口;如果使用中断方式,该引脚应接至微处理器的外部中断输入端。
同时应将该中断触发控制位设置成下降沿有效的边沿触发方式。
HD7279键盘显示的应用设计目录一.整体方案 (1)1.系统概述 (1)2.芯片内部结构及原理 (2)二.理论分析与计算 (5)1.设计思想 (5)2.设计流程 (6)三.电路与程序设计 (7)1.硬件电路设计 (7)2.程序设计 (7)四.结果分析 (11)五.总结(经验教训) (13).整体方案(方案论证)1.系统概述近年来,随着科学技术的发展,仪器的人性化和智能化在人们生活的各个领域之中的作用越来越明显。
单片机的应用越来越广泛,其中很多地方都是通过按键来实现各项所需功能。
键盘、显示接口是单片机应用系统中最常用的基本接口电路。
因单片机自身体积小 ,引脚少 ,在设计单片机系统时 ,如系统所需的按键较多 ,需显示的十进制位数较多单片机自身的引脚不够用 ,并且此时串行口又要用作它用时 ,在以往的设计中 ,往往以总线方式外接8255或8155芯片 ,以便扩展并行口。
这种方法因使用的芯片的体积大引脚多 ,而使硬件系统较为庞大。
另一种方法是将键盘和显示接口直接与单片机的 I/O引脚相接 ,但这种方法将占用较多有限的 I/O口。
为了使有限的 I/O口用于实现更多的系统功能 ,同时系统的硬件设计和软件设计尽可能简洁 ,我们在单片机多键盘、多位数显示接口的应用系统设计电路中 ,选用了片内有 4KB Flash 存储器的 AT89C51 单片机 ,接口采用非总线结构。
在显示部分通过译码器控制段码和位线 ,尽量减少 I/O 口的使用。
在键盘部分 ,键盘的扫描交给74922集成芯片来完成 ,使 CPU减轻用软件去扫描键盘的负担 ,提高 CPU 的利用率 ,较好地完成了设计任务。
2.芯片内部结构及原理74922芯片74922芯片是专用编码键盘接口芯片 ,当按下某一按键时 ,该芯片能自动给出相应的编码信息 ,并可自动消除抖动 ,从而可使设计者免除一部分软件编程。
74922芯片有16键 IC和20键 IC,图1所示为4 ×4(16键)扫描式编码键盘原理图。
华北电力大学实验报告||实验名称 HD7279课程名称DSP系统设计||专业班级:电子0901班学生姓名:陈跃聪学号: 200903020104 成绩:指导教师:姚国珍实验日期:2012.4.11实验四HD7279一、目的与要求1.掌握HD7279的使用方法。
2.掌握外部中断的实现方法。
3.掌握I/O设备的扩展方法和CPLD的应用。
二、主要内容1. 阅读HD7279芯片文档,学习其使用方法,重点是串口数据通信方法。
2. 阅读实验台CPLD的下载程序,学习其在键盘扩展实验中的应用。
3. 学习实验台程序学习HD7279串行通信的实现方法。
4.在实验台上运行程序,掌握实验实现原理。
三、实验的步骤及现象实验现象:这是一个综合性的实验,综合了外部中断和I/O扩展键盘控制,实验的现象是,数码管先进行一次检测扫描,且依次由右至左移动,数值有0到F结束,然后全部熄灭,结下来如过你按下键盘,最高位也就是最右边的那个数码管会显示你按下的键值,按下下一个键时,前一个键值会向左移动一位,最后移出8位显示管。
同时伴随着按键的按下,数码管下的LED灯会交替闪烁。
实验的主要程序如下:#include "DspRegDefine.h" //VC5402 寄存器定义//--------------- HD7279A 指令-----------------------------#define CMD_RESET 0xa4 //复位#define CMD_TEST 0xbf //测试#define RTL_UNCYL 0xa1 //左移#define RTR_UNCYL 0xa0 //右移#define RTL_CYCLE 0xa3 //循环左移#define RTR_CYCLE 0xa2 //循环右移#define DECODE0 0x80 //下载数据按方式0译码#define DECODE1 0xc8 //下载数据按方式1译码#define UNDECODE 0x90 //下载数据但不译码#define BLINKCTL 0x88 //闪烁控制#define ACTCTL 0x98 //消隐控制#define SEGON 0xe0 //段点亮#define SEGOFF 0xc0 //段关闭#define CMD_READ 0x15 //读键盘数据void send(){UINT16 i;cs_low(); //片选CS=0delay_50us(); //延时50us// 数值的显示,最右边的那个数码管显示按下的键值for(i=0;i<8;i++){switch(send_buff&0x80){case 0x00:temp7279 = port0008; //7279data低break;case 0x80:port0008 = 0; //7279data高}port0007 = 0;//7279clk高delay_8us();temp7279 = port0007;//7279clk低delay_8us();send_buff<<=1;}}void receive(){UINT16 i;port0005 = 0; //DIR配置成输入asm(" nop");delay_50us();for(i=0;i<8;i++){//7279clk高port0007 = 0;delay_8us();key7279 = port0009& 0x0001;asm(" nop ");//接收到的数据在D0位data_buff=data_buff|(key7279<<(15-i));//7279clk低temp7279 = port0007;delay_8us();}asm(" nop "); //在这里设置断点观察data_buff中的值rece_buff=(data_buff>>8) & 0x00ff; //接收到的数据右移给rece_buffdata_buff=0x0000; //清除data_bufftemp7279 = port0005;//DIR配置成输出}interrupt void int0() //中断0中断子程序{UINT16 temp;*(unsigned int*)IFR = 0xFFFF; //清除所有中断标志,"写1清0"send_buff = CMD_READ; //读键值指令send();receive();asm(" nop ");send_buff = RTL_UNCYL; //数据左移指令send();send_buff = DECODE1;send();send_buff = rece_buff; //将接收到的键值送显示send();show = ~show;cs_high(); //7279CS置高asm(" rsbx INTM"); //开总中断return;}void main(){UINT16 temp;//----------系统初始化-------------------------------asm(" nop ");cpu_init(); //初始化CPUasm(" nop ");//---------------------------------------------------temp7279 = port0005; //DIR =0 ,输出数据给7279//-----------7279复位--------------------------------asm(" nop ");send_buff = CMD_RESET; //复位指令send();delay_25ms(); //25ms延迟--复位延迟Delay(100);asm(" nop ");//-----------7279测试--------------------------------send_buff = CMD_TEST; //测试指令send();Delay(50000);asm(" nop ");//-----------7279复位--------------------------------send_buff = CMD_RESET; //复位指令send();delay_25ms(); //25ms延迟--复位延迟Delay(100);asm(" nop ");//-----------7279显示0\1\2---f----------------------for(temp=0;temp<16;temp++) //送出数据0x00~0x0F{send_buff = DECODE1; }send();send_buff = temp; 扫描检测从0到E 依send(); 显示Delay(9000);send_buff = RTL_UNCYL; //数据左移指令send();Delay(9000); }//-----------7279复位--------------------------------send_buff = CMD_RESET; //复位指令send();//-----------7279CS='1'-----------------------------cs_high();//-----------外部中断1初始化------------------------xint0_init(); //外部中断1初始化子程序asm(" nop ");//----------- 等待键盘中断--------------------------while(1){port0004 = show;}}从实验的程序我们可以看出,其中包含上次实验中的主要部分,例如寄存器的配置等等,所以对于那部分的分析也和上次实验的一样。
HD7279A在单片机键盘和显示接口中的应用
李外云
【期刊名称】《湖南理工学院学报(自然科学版)》
【年(卷),期】2001(014)001
【摘要】介绍了串行键盘和显示接口芯片HD7279A的各种控制命令字的功能和用法,通过实例从硬件和软件方面介绍其在单片机键盘和显示接口中的应用。
%This paper introduces the function and use of control command word of serial keyboard and dis-plays interface of HD7279A in detail, and introduces its keyboard and displays interface and application in sin-gle-chip-computer from hardware and soft via example.
【总页数】4页(P78-81)
【作者】李外云
【作者单位】岳阳师范学院物理系,湖南岳阳 414006
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.PIC单片机扩展HD7279A键盘显示接口的新方法 [J], 邓洪峰;林林;叶学
2.基于HD7279A的单片机显示及键盘系统设计 [J], 姜楠;宋文龙;郭晓刚
3.键盘显示智能控制芯片HD7279A的应用设计 [J], 陈光绒;胡克满
4.键盘显示驱动芯片HD7279A及其应用 [J], 陈晓燕;汪道辉
5.键盘显示驱动芯片HD7279A及其应用 [J], 陈晓燕;汪道辉
因版权原因,仅展示原文概要,查看原文内容请购买。
可编程数码管/键盘串行接口芯片HD7279A的原理与应用摘要:HA7279A是一种智能键盘和LED专用控制芯片,它带有串行接口,可同时驱动8位共阴式数码管或6 4只独立LED。
文中详述了该芯片的工作原理、工作时序及控制指令,给出了HD7279A与CPU的实际接口电路及设计程序,同时指出了实际应用中的一些注意事项。
关键词:HD7279A;工作时序;接口电路1主要特性HD7279A是比高公司生产的单片具有串行接口、可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时可连接多达64键的键盘矩阵,一片即可完成LED显示及键盘接口的全部功能。
HD7279A和微处理器之间采用串行接口,其接口和外围电路比较简单,且占用口线少,加之它具有较高的性能价格比,因此,在微型控制器、智能仪表、控制面板和家用电器等领域获得了日益广泛的应用。
HD7279A的主要特点如下:●带有串行接口,无需外围元件便可直接驱动LED;●各位可独立控制译码/不译码、消隐和闪烁等属性;●具有(循环)左移/(循环)右移指令;●具有段寻址指令,可方便地用来控制独立的LED显示管;●64键键盘控制器内含去抖动电路。
2引脚说明HD7279A一共有28个引脚,各引脚的主要功能如下:RESET:复位端。
当该端由低电平变成高电平,并保持25ms后,复位过程结束。
通常,该端接+5V电源;DIG0~DIG7:8个LED管的位驱动输出端;SA~SG:LED数码管的A段~G段的输出端;DP:小数点的驱动输出端;RC:外接振荡元件连接端,其中电阻的典型值为1.5kΩ 电容的典型值为15pF。
HD7279A与微处理器仅需4条接口线,其中CS为片选信号(低电平有效)。
DATA为串行数据端,当向HD7279A发送数据时,DATA为输入端;当HD7279A输出键盘代码时,DATA为输出端。
CLK为数据串行传送的同步时钟输入端,时钟的上升沿表示数据有效。
1单片机与HD7279的子程序ORG 0100HSTART: MOV SP,#2FHMOV P1,#BLCALL DELAY25MMOV DATA_OUT,#0A4H LCALL SENDSETB CSMAIN: JB KEY,MAINMOV D ATA_OUT,#15H LCALL SENDLCALL RECEIVSETB CSMOV A,DATA_INANI A,#0F0HSWAP AMOV TEN,AMOV A,DATA_INANL A,#0FHMOV DIGTT,AMOV DATA_OUT,#0A1H LCALL SENDMOV DATA_OUT,#81H LCALL SENDLCALL DELAY100MOV DATA_OUT,TEN LCALL SENDMOV DATA_OUT,#80H LCALL SENDLCALL DELAY100MOV DATA_OUT,TEN LCALL SENDMOV DATA_OUT,#80H LCALL SENDLCALL DELAY100MOV DATA-OUT,DIGIT LCALL SENDSETB CSWAIT: INB KEY,WAITLJMP MAIN SEND: MOV BIT_COUNT,#8 CLR CSSEN_LOOP: LCALL DELAY100MOV C,DATA_OUT,7 MOV DAT,CSETB CLK:CLKMOV A,DATA_OUTBLAMOV DATA_OUT,ALCALL DELAY100CLR CLKDJNZ BIT_COUNT,SEND_LOOP CLR DATLCALL DELAY100RETEND2 键盘子程序#include< >#define uint unsigned int#define uchar unsigned char#define ulong unsigned long void delay10ms(); //按键去抖。
void keyboard(){=0;=0;=1;=0;=1;uchar key;while(1){P2=0xff;P2_4=0;key=P2&0x0f;if(key!=0x0f){delay10ms();key=P2&0x0f;if(key!=0x0f){switch(key){case 0x0e:display();break; case 0x0d:dispbulai();break; case 0x0b:shiftup();break; case 0x07:shiftdown();break; }key=key&0x0f;while(key!=0x0f){key=P2key=key&0x0f; }}}P2=0xff;P2_5=0;key=P2;key=key&0x0f; if(key!=0x0f) {delay10ms(); key=P2&0x0f; if(key!=0x0f) {switch(key){case 0x0e:p1=1;break; case 0x0d:p1=2;break; case 0x0b:p1=3;break; case 0x07:p1=0;break; }key=key&0x0f;while(key!=0x0f) {key=P2;key=key&0x0f;}}}P2=0xff;P2_6=0;key=P2;key=key&0x0f;if(key!=0x0f){delay10ms();key=P2&0x0f;if(key!=0x0f){switch(key){case 0x0e:p1=4;break; case 0x0d:p1=5;break; case 0x0b:p1=6;break; case 0x07:send();break;}key=key&0x0f; while(key!=0x0f) {key=P2;key=key&0x0f;}}}P2=0xff;P2_7=0;key=P2;key=key&0x0f;if(key!=0x0f) {delay10ms();key=P2&0x0f;if(key!=0x0f){switch(key){case 0x0e:p1=7;break; case 0x0d:p1=8;break; case 0x0b:p1=9;break; case 0x07:;break;}key=key&0x0f;while(key!=0x0f) {key=P2key=key&0x0f;}}}}}void delay10ms() {uchar i,j;for(i=50;i>0;i--) for(j=200;j>0;j--); }3 LCD液晶显示子程序#include <>#include <>sbit bz=P3^5;sbit rq=P3^4;delay() //延时{unsigned char i,j;for(i=0;i<2;i++){for(j=0;j<5;j++);}}longdelay(){unsigned int i,j;for (i=0;i<15;i++){for (j=0;j<100;j++);}}disp(int dat){if(bz==0){P0=dat;delay();rq=1;}while(bz==0);rq=0;}hz(int ff,int xx,int yy) //显示命令+坐标子程序{ disp(ff);delay();disp(xx);delay();disp(yy);delay();}hz2(int gg,int dd) // 汉字代码子程序{disp(gg);delay();disp(dd);delay();}displai() //显示辣菜{ =0;=0;=0;=1;=0;longdelay();bz=1;rq=0;while(1){ hz(0xc0,0x38,0x0c,0x1f,0x01,0x06,0x18,0x60,0x01,0x06,0x1c,0xfc,0xc4,0x34,0x0c,0x03,); //1longdelay();hz(0x80,0x41,0x31,0x11,0x19,0x15,0x13,0xff,0x11,0x11,0x13,0 x15,0x19,0x11,0x21,0x40,);hz2(0x00,0x01,0x02,0x04,0x08,0x10,0x60,0xc0,0xc0,0x60,0x38, 0x1c,0x0e,0x07,0x02,0x01,); //夫longdelay();hz(0x80,0x44,0x75,0x55,0x5d,0x55,0x57,0xff,0x55,0x55,0x57,0 x5f,0x4c,0x54,0x24,0x40,);hz2(0x40,0x41,0x43,0x45,0x59,0x7a,0xea,0x44,0xc4,0x4a,0x72, 0x51,0x49,0x44,0x42,0x01,); //妻longdelay();hz(0x80,0x40,0x7f,0x58,0x48,0x7f,0x22,0x27,0x24,0x25,0xff,0 x24,0x2c,0x37,0x20,0x40,);hz2(0x02,0x0d,0xf2,0x84,0x8a,0xfc,0x20,0xf8,0x80,0x40,0xff, 0x10,0x08,0xf4,0x02,0x01,); //肺hz(0x80,0x40,0x20,0x7f,0x08,0x0c,0x0a,0x09,0x08,0xf9,0x0a,0 x0c,0x08,0x18,0x28,0x40,);hz2(0x01,0x03,0x0e,0xf4,0x88,0x90,0xa0,0xc0,0x80,0xc0,0xa0, 0xff,0x08,0x04,0x02,0x01,); //片longdelay();hz(0xc0,0x38,0x0c,0x1f,0x01,0x06,0x18,0x60,0x01,0x06,0x1c,0xfc,0xc4,0x34,0x0c,0x03,);hz2(0xc0,0x3f,0x1c,0x13,0x11,0x16,0x18,0x60,0x01,0x9e,0x9c,0x64,0xc4,0xb8,0x7c,0x03,); //15longdelay();hz(0xc0,0x3e,0x1c,0x13,0x11,0x17,0x1e,0x60,0x01,0x0e,0x1c,0x64,0xc4,0xb4,0x0c,0x03,); //2longdelay();hz(0x81,0x5d,0x75,0x55,0x5d,0x45,0x7f,0x45,0x09,0x31,0xd7,0 x14,0x1c,0x18,0x30,0x40,);hz2(0x00,0x79,0x4a,0x4c,0x7a,0x11,0xfe,0x42,0x84,0x58,0xe0, 0x10,0x0c,0x07,0x02,0x01,); //歌hz(0x80,0x40,0x22,0x3f,0x2a,0x26,0x22,0x63,0x5f,0x43,0xc2,0 xc6,0x4a,0x12,0x20,0x40,);hz2(0x00,0x05,0x1a,0x34,0xe8,0x58,0x24,0x42,0xfc,0x40,0x20, 0x50,0x38,0x1c,0x0a,0x01,); //乐longdelay();hz(0x80,0x40,0x27,0x10,0x08,0x04,0x02,0xff,0x00,0x01,0x02,0 x04,0x08,0x17,0x20,0x40,);hz2(0x00,0x05,0xfe,0x04,0x0c,0x14,0x24,0xfc,0x84,0x44,0x24, 0x14,0x0c,0xfe,0x02,0x01,); //山longdelay();hz(0xa2,0x6a,0xa6,0x73,0x2e,0x2e,0x22,0x27,0x24,0x25,0xff,0 x24,0x2c,0x37,0x20,0x40,);hz2(0x41,0x43,0x4e,0xf4,0x48,0x52,0x24,0xc8,0xb0,0xc0,0xff, 0xb0,0x98,0x8c,0x0a,0x01,); //辣longdelay();hz(0x80,0x40,0x60,0x50,0x48,0x44,0x42,0x47,0x48,0x51,0x62,0 x44,0x08,0x11,0x20,0x40,);hz2(0x80,0x81,0x82,0x84,0x88,0x92,0xa1,0xfe,0x80,0xc0,0xa0, 0x90,0x88,0x84,0x82,0x01,); //子hz(0xa0,0x68,0x26,0x31,0x2e,0x34,0x02,0x3f,0x30,0x6d,0xa2,0 x25,0x3e,0x10,0x20,0x40,);hz2(0x08,0x11,0x62,0x84,0xc8,0x30,0x20,0xd0,0x90,0xd0,0xb0, 0x92,0x89,0xfe,0x02,0x01,); //鸡longdelay();hz(0xc0,0x3c,0x1c,0x13,0x11,0x16,0x1c,0x60,0x01,0x1e,0x1c,0x64,0xc4,0xb8,0x7c,0x03,);hz2(0xc0,0x3f,0x1c,0x13,0x11,0x16,0x18,0x60,0x01,0x9e,0x9c,0x64,0xc4,0xb8,0x7c,0x03,); //35longdelay();hz(0xc0,0x3c,0x1c,0x13,0x11,0x16,0x1c,0x60,0x01,0x1e,0x1c,0x64,0xc4,0xb8,0x7c,0x03,); //3longdelay();hz(0xa2,0x6a,0xa6,0x73,0x2e,0x2e,0x22,0x27,0x24,0x25,0xff,0 x24,0x2c,0x37,0x20,0x40,);hz20x41,0x43,0x4e,0xf4,0x48,0x52,0x24,0xc8,0xb0,0xc0,0xff,0 xb0,0x98,0x8c,0x0a,0x01, (); //辣hz(0x90,0x4c,0xa0,0x73,0x0c,0x06,0x02,0x03,0x02,0xff,0x02,0 x06,0x0a,0x12,0x22,0x40,);hz2(0x20,0x21,0xff,0x04,0x08,0x10,0x20,0x40,0x80,0xff,0x20, 0x10,0x08,0x04,0x02,0x01,); //汁longdelay();hz(0xa0,0x61,0x21,0x31,0x2f,0xfd,0x23,0x21,0x20,0x23,0xfa,0 x26,0x2a,0x33,0x20,0x40,);hz2(0x02,0x05,0x0a,0x34,0xc8,0x14,0x26,0xfc,0x80,0xfe,0x24, 0x14,0x0c,0xfe,0x02,0x01,); //茄longdelay();hz(0x80,0x42,0x27,0x1a,0x7a,0x27,0x06,0x01,0x02,0x0f,0x7a,0 x27,0x0e,0x14,0x20,0x40,);hz2(0x02,0x03,0x22,0x66,0xaa,0x32,0x22,0x42,0xa2,0x62,0xa2, 0x32,0x2a,0x26,0x02,0x01,); //丝longdelay();hz(0xc0,0x38,0x0c,0x1f,0x01,0x06,0x18,0x60,0x01,0x06,0x1c,0xfc,0xc4,0x34,0x0c,0x03,);hz2(0xc0,0x38,0x0c,0x1f,0x01,0x06,0x18,0x60,0x01,0x06,0x1c,0xfc,0xc4,0x34,0x0c,0x03,); //15longdelay();}}dispbulai() //显示不辣菜{=0;=0;=0;=1;=0;longdelay();bz=1;rq=0;while(1){ hz(0x80,0x48,0x28,0x1f,0x08,0x04,0x02,0x01,0x00,0x01,0x02 ,0x04,0x08,0x10,0x20,0x40,);0x10,0x08,0x04,0x02,0x01,); //1longdelay();hz(0xa4,0x5c,0x27,0xff,0x0d,0x14,0x3f,0x2b,0x2a,0xab,0x7f,0 x2e,0x2a,0x3f,0x22,0x40,);hz2(0x10,0xe1,0x02,0xff,0x0a,0x9c,0xf0,0xdf,0x92,0xd2,0xf2, 0x92,0x9a,0x9f,0x02,0x01,); //糖longdelay();hz(0xcf,0x48,0x7f,0x58,0x7f,0x4c,0x4f,0x43,0x12,0xff,0x12,0 x16,0xfe,0x12,0x22,0x40,);hz2(0xfe,0xa5,0x26,0x24,0xac,0xb4,0xfe,0x40,0xff,0xd2,0xb2, 0x92,0x9a,0xff,0x02,0x01,)); //醋longdelay();hz(0x80,0x40,0xff,0x99,0x89,0x8d,0x8b,0xff,0x89,0x89,0x8b,0 x8d,0xff,0x10,0x20,0x40,);hz2(0x02,0x03,0x22,0x26,0x2a,0x32,0x22,0xfe,0xa2,0x62,0x22, 0x32,0x2a,0x06,0x02,0x01,); //里longdelay();hz(0x80,0x49,0x6d,0x3a,0x1b,0x05,0x1b,0xe1,0x11,0x09,0x27,0 x35,0x5a,0x13,0x22,0x40,);0xfe,0x08,0x04,0x02,0x01,); //脊longdelay();hz(0x00,0x05,0x06,0xfc,0x0c,0x14,0x20,0x40,0x80,0x40,0x20,0 x10,0x08,0x04,0x02,0x01,);hz2(0xc0,0x3f,0x1c,0x13,0x11,0x16,0x18,0x60,0x01,0x9e,0x9c, 0x64,0xc4,0xb8,0x7c,0x03,); //15longdelay();hz(0xc0,0x3e,0x1c,0x13,0x11,0x17,0x1e,0x60,0x01,0x0e,0x1c,0x64,0xc4,0xb4,0x0c,0x03,); //2longdelay();hz(0x80,0x61,0x22,0x3c,0x29,0xff,0x2e,0x29,0x29,0xff,0x2a,0 x2c,0x2f,0x30,0x20,0x40,);hz2(0x00,0x03,0xae,0xa4,0x2c,0x52,0x62,0xd2,0x9a,0xc2,0x62, 0x3e,0xd8,0x0e,0x06,0x01,); //葱longdelay();hz(0x88,0xc6,0x60,0x1f,0x08,0x0f,0x0a,0x09,0x08,0xff,0x0a,0 x0c,0x08,0x1f,0x20,0x40,);hz2(0x20,0x21,0xff,0x04,0x08,0xff,0x62,0x42,0xc2,0xfe,0x62,0x52,0x4a,0xff,0x02,0x01,); //油longdelay();hz(0x84,0x5f,0xe4,0x37,0x2c,0x37,0x02,0x7f,0x49,0x49,0x7f,0 x4d,0x49,0x7f,0x20,0x40,);hz2(0x02,0xf3,0x92,0xf4,0x9c,0xf4,0x22,0x62,0xa2,0x62,0xfe, 0x32,0x2a,0x26,0x02,0x01,); //鲤longdelay();hz(0x84,0x5f,0xe4,0x37,0x2c,0x37,0x02,0x7f,0x49,0x49,0x7f,0 x4d,0x49,0x7f,0x20,0x40,);hz2(0x02,0xf3,0x92,0xf4,0x9c,0xf4,0x22,0x62,0xa2,0x62,0xfe, 0x32,0x2a,0x26,0x02,0x01,); //鱼longdelay();hz(0xc0,0x3e,0x1c,0x13,0x11,0x17,0x1e,0x60,0x01,0x0e,0x1c,0x64,0xc4,0xb4,0x0c,0x03,);hz2(0xc0,0x3f,0x1c,0x13,0x11,0x16,0x18,0x60,0x01,0x9e,0x9c,0x64,0xc4,0xb8,0x7c,0x03,); //25 longdelay(); hz(0xc0,0x3c,0x1c,0x13,0x11,0x16,0x1c,0x60,0x01,0x1e,0x1c,0x64,0xc4,0xb8,0x7c,0x03,); //3longdelay();hz(0x82,0x4a,0x6a,0x32,0x2a,0xff,0x16,0x27,0xd7,0x4b,0x4a,0 x56,0x6a,0x12,0x22,0x40,);hz2(0x00,0x01,0xff,0x9e,0xaa,0xda,0xaa,0xca,0xea,0xea,0xaa, 0xba,0xff,0x04,0x02,0x01,); //酱longdelay();hz(0x84,0x44,0x24,0x14,0x0c,0x04,0x07,0xff,0x05,0x05,0x06,0 x04,0x0c,0x14,0x24,0x40,);hz2(0x00,0x01,0x02,0x04,0x08,0x30,0xe0,0x40,0x80,0x60,0x30, 0x1c,0x0e,0x07,0x02,0x01,); //大longdelay();hz(0x80,0x46,0x24,0xfc,0xad,0xa5,0xa7,0xbd,0x85,0x85,0x87,0 xfd,0x0c,0x16,0x24,0x40,);hz2(0x00,0x01,0x02,0x04,0xff,0x50,0x70,0x50,0xd0,0x52,0x71, 0xfe,0x08,0x04,0x02,0x01,); //骨longdelay();hz(0xc0,0x30,0x0f,0x07,0x09,0x1f,0x18,0x60,0x01,0xe6,0x38,0x64,0xe4,0xfc,0x2c,0x03,);hz2(0xc0,0x37,0x0c,0x13,0x11,0x0e,0x1f,0x60,0x01,0xf6,0x18,0x64,0xc4,0x38,0xfc,0x03,); //40longdelay();hz(0xc0,0x30,0x0f,0x07,0x09,0x1f,0x18,0x60,0x01,0xe6,0x38,0x64,0xe4,0xfc,0x2c,0x03,); //4longdelay();hz(0x80,0x40,0x27,0x10,0x08,0x04,0x02,0xff,0x00,0x01,0x02,0 x04,0x08,0x17,0x20,0x40,);hz2(0x00,0x05,0xfe,0x04,0x0c,0x14,0x24,0xfc,0x84,0x44,0x24, 0x14,0x0c,0xfe,0x02,0x01,); //山longdelay();hz(0xc2,0x42,0x7f,0x52,0x4a,0x04,0x0b,0x11,0x22,0xc5,0x2a,0 x15,0x08,0x14,0x24,0x40,);hz2(0x10,0x11,0xe3,0x25,0x29,0x12,0x32,0x64,0xa4,0x48,0xa8, 0x10,0x28,0xc4,0x02,0x01,); //珍longdelay();hz(0x80,0x47,0x20,0xff,0x09,0x35,0x22,0x23,0xf4,0x2d,0x26,0 x2e,0x39,0x37,0x21,0x40,);hz2(0x82,0x0d,0x32,0xc4,0x29,0x92,0xac,0xf0,0x80,0xc0,0xfc, 0x92,0x8a,0x86,0x0e,0x01,); //烧longdelay();hz(0x80,0x40,0x3f,0x10,0x19,0x16,0x16,0xf9,0x14,0x13,0x13,0 x14,0x18,0x1f,0x20,0x40,);hz2(0x00,0x01,0xff,0x84,0x08,0x10,0x60,0xc0,0xc0,0x60,0x38, 0x12,0x09,0xfe,0x02,0x01,); //肉longdelay();hz(0xc0,0x3e,0x1c,0x13,0x11,0x17,0x1e,0x60,0x01,0x0e,0x1c,0x64,0xc4,0xb4,0x0c,0x03,);hz2(0xc0,0x3e,0x1c,0x13,0x11,0x17,0x1e,0x60,0x01,0x0e,0x1c,0x64,0xc4,0xb4,0x0c,0x03,); //25 longdelay();}}shiftup(){=0;=0;=0;=1;=0;disp(0xf5); //上移longdelay();longdelay();longdelay();longdelay();longdelay();longdelay() ;}shiftdown{=0;=0;=0;=1;=0;disp(0xf6); //下移longdelay();longdelay();longdelay();longdelay();longdelay();longdelay() ;}。