1单片机与HD7279的子程序
基于c51与HD7279的万年历

单片机课程设计报告题目:万年历学年: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)流程图:三、使用说明书:打开电源,显示时间。
HD7279键盘显示的应用设计说明

这种键盘的按键排成矩阵形式 ,以减少按键联线。如图中有16个键 ,排列成4行 4 列 ,仅需 8 根引线。时钟发生器的输出送给4位计数器进行计数 ,计数器的低 2 位经译码后作为行扫描 ,高2位经译码后作为列扫描。若没有检出有键闭合 ,则计数器周而复始反复计数 ,即反复进行扫描 ,一旦检出有键闭合 ,就发出一个脉冲使时钟振荡器停振 ,计数器随即停止计数。单片机通过读取计数器的计数值来获取闭合键所在的行列位置 ,然后从 ROM中查表
图2 74922(16键)引脚排列图
DA:数据有效信号。若无键按下 ,保持低电平。若有键按下 ,变为高电平 ,直到键放开 ,才转为低电平。/OE:输出使能。D~A:按键值输出 ,按BCD码输出。
2.3
在设计单片机系统时 ,为了实现系统所需的多按键 ,多位十进制数显示的和节约 I/O口资源 ,简化硬件电路要求 ,在串行口被用于其它用途的情况下 ,我们选用了一种新型的键盘、显示接口电路。其设计思想为:在显示部分:用 7 根 I/O 线通过七段译码器(7447)和at89c51外接了 8 个LED数码管即可完成动态显示。其中 ,段码采用硬件译码 ,单片机读到的键盘值送到 P0 口的低 4 位 ,经 7447 七段译码器译成段码送数码管。而位线由 P2 口的 P2.0~P2.78位控制。在键盘部分:键盘扫描由74922芯片来完成。设计中用了5个 I/O线于74922芯片相接。其中4根 I/O线(P1.0~P1.3)接 74922 的 A、B、C、D引脚 ,向单片机传送键值的BCD码。P1.4接74922的DA引脚 ,作为是否有键按下和按键是否放开的识别端。程序中只要检测 DA脚由低电平 →高电平(有键按下) 、高电平 →低电平 (键放开) ,就将 74922 的 D、C、B、A (键值的 BCD 码) 读入AT89C51。这个键值再由 P0 口的低 4 位送给七段译码器7447 ,硬件译码后的段码送给数码管显示。使得键盘控制程序相当简单 ,减轻了 CPU 用软件去扫描键盘 ,读取键值的负担 ,从而提高了 CPU的利用率。
基于c51与HD7279的时钟

浙江万里学院电信学院课程设计报告课程名称:单片机课程设计设计内容:万年历实验时间:2010年9月实验地点:10404专业班级:通信081姓名:*****学号:**********指导老师:*****2010年9 月28 日1、1数字万年历产生的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。
、1、2数字万年历的意义万年历是采用数字电路实现对年、月、日,时、分、秒,数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
MSP430程序HD7279键盘程序

//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);}}。
HD7279A的原理与应用

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

BIT_COUNT DATA 07FH TIMER DATA 07EH TIMER1 DATA 07DH TEN DATA 07CH DATA_IN DATA 020H DATA_OUT DATA 021H
CS CLK DATA KEY
(2).接收一字节子程序:(接收字符存于A中) STJS: MOV R7,#08H LP1: SETB P1.1 SETB P1.2 MOV R6,#02H LP2: DJNZ R6,LP2 MOV C, P1.2 RLC A CLR P1.1 MOV R6,#01H LP3: DJNZ R6,LP3 DJNZ R7,LP1 RET
D7 1 D6 0 D5 1 D4 0 D3 0 D2 0 D1 0 D0 0
与左移指令类似,但所做移动为自左向右(从第8位 向第1位)移动,移动后,最左边一位为空。 B.带有数据的指令 (1). 下载数据且按方式0译码
D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
(2). 左移指令A1H
D7 1 D6 0 D5 1 D4 0 D3 0 D2 0 D1 0 D0 1
例如,原显示为:
4 2 5 2 L P 3 9
其中第2位‘3’和第4位‘L’为闪烁显示,
执行了左移指令后,显示变为:
2 5 2 L P 3 9
第2位‘9’和第4位‘P’为闪烁显示。
(3).右移指令A0H
4.串行接口的时序图。 A、HD7279A的指令结构类型: (1)、不带数据的纯指令,指令的宽度为8个BIT。即微处 理器需发送8个CLK脉冲。 (2)、带有数据的指令,宽度为16个BIT,即微处理器需 发送16个CLK脉冲。 (3)、读取键盘数据指令,宽度为16个BIT,前8个为微处 理器发送到HD7279A的指令,后8个BIT为HD7279A返 回的键盘代码。执行此指令时,HD7279A的DATA端在 第9个CLK脉冲的上升沿变为输出状态,并与第16个 脉冲的下降沿恢复为输入状态,等待接收下一个指 令。 B、串行接口的时序图:
HD7279键盘显示的应用设计文

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

华北电力大学实验报告||实验名称 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;}}从实验的程序我们可以看出,其中包含上次实验中的主要部分,例如寄存器的配置等等,所以对于那部分的分析也和上次实验的一样。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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() ;}。