📄 systhree.c
字号:
#include <absacc.h>
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint8 unsigned char
#define uint16 unsigned int
#define LED1 XBYTE [0xA000] //数码管地址
#define LED2 XBYTE [0xA001]
#define LED3 XBYTE [0xA002]
#define LED4 XBYTE [0xA003]
#define LED5 XBYTE [0xA004]
#define LED6 XBYTE [0xA005]
#define LED7 XBYTE [0xA006]
#define LED8 XBYTE [0xA007]
#define KEY XBYTE [0xA100] //键盘地址
#define lcdDl XBYTE [0xA201] //左半边液晶数据地址
#define lcdDr XBYTE [0xA301] //右半边液晶数据地址
#define lcdlCommand XBYTE [0xA200]//左半边液晶命令地址
#define lcdrCommand XBYTE [0xA300]//右半边液晶命令地址
/*液晶显示使用的常量*/
#define strat_yaddr 0x40
#define strat_xaddr 0xb8
#define strat_dispaddr 0xc0
#define libleng 0x5F //字模库容量
#define dataleng 16*8 //全屏8*8点阵容量
xdata uchar RAM[32768] _at_ 0x0000;//外部RAM地址
/*扫描键盘使用的变量 */
sbit first_row = P1^4; //键盘第一行控制
sbit second_row = P1^3; //键盘第二行控制
bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0; //防止按键冲突标志位
uchar keynum = 0; //获得的有效按键值寄存器
/*读写flash使用的变量*/
sbit scl = P1^0; //24C16 scl
sbit sda = P1^1; //24c16 sdl
/*数码管显示使用的变量和常量*/
uchar lednum = 0; //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black"
/*液晶显示使用的变量*/
uchar code worddata[dataleng] = "National University of Defence Technology's Electric Laboratory Center Author:GYF 2005/11/19 ";//自定义要显示的ASCII字符串
//8*8点阵ASCII全部字符表
uchar code ASCII[libleng][8] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*SPACE*/
{0x00,0x00,0x7e,0x21,0x21,0x21,0x7e,0x00},/*A*/
{0x00,0x00,0x7f,0x49,0x49,0x49,0x36,0x00},/*B*/
{0x00,0x00,0x3e,0x41,0x41,0x41,0x22,0x00},/*C*/
{0x00,0x00,0x7f,0x41,0x41,0x22,0x1c,0x00},/*D*/
{0x00,0x00,0x7f,0x49,0x49,0x49,0x49,0x00},/*E*/
{0x00,0x00,0x7f,0x09,0x09,0x09,0x01,0x00},/*F*/
{0x00,0x00,0x3e,0x41,0x49,0x49,0x7a,0x00},/*G*/
{0x00,0x00,0x7f,0x08,0x08,0x08,0x7f,0x00},/*H*/
{0x00,0x00,0x41,0x7f,0x41,0x00,0x00,0x00},/*I*/
{0x00,0x00,0x20,0x40,0x41,0x3f,0x01,0x00},/*J*/
{0x00,0x00,0x7f,0x08,0x14,0x22,0x41,0x00},/*K*/
{0x00,0x00,0x7f,0x40,0x40,0x40,0x40,0x00},/*L*/
{0x00,0x00,0x7f,0x02,0x0c,0x02,0x7f,0x00},/*M*/
{0x00,0x00,0x7f,0x04,0x08,0x10,0x7f,0x00},/*N*/
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},/*O*/
{0x00,0x00,0x7f,0x09,0x09,0x09,0x06,0x00},/*P*/
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},/*Q*/
{0x00,0x00,0x7f,0x09,0x19,0x29,0x46,0x00},/*R*/
{0x00,0x00,0x46,0x49,0x49,0x49,0x31,0x00},/*S*/
{0x00,0x00,0x01,0x01,0x7f,0x01,0x01,0x00},/*T*/
{0x00,0x00,0x3f,0x40,0x40,0x40,0x3f,0x00},/*U*/
{0x00,0x00,0x1f,0x20,0x40,0x20,0x1f,0x00},/*V*/
{0x00,0x00,0x3f,0x40,0x38,0x40,0x3f,0x00},/*W*/
{0x00,0x00,0x63,0x14,0x08,0x14,0x63,0x00},/*X*/
{0x00,0x00,0x07,0x08,0x70,0x08,0x07,0x00},/*Y*/
{0x00,0x00,0x61,0x51,0x49,0x45,0x43,0x00},/*Z*/
{0x00,0x00,0x20,0x54,0x54,0x54,0x7c,0x00},/*a*/
{0x00,0x00,0x7f,0x48,0x44,0x44,0x38,0x00},/*b*/
{0x00,0x00,0x38,0x44,0x44,0x44,0x20,0x00},/*c*/
{0x00,0x00,0x38,0x44,0x44,0x48,0x7f,0x00},/*d*/
{0x00,0x00,0x38,0x54,0x54,0x54,0x18,0x00},/*e*/
{0x00,0x00,0x08,0x7e,0x09,0x01,0x02,0x00},/*f*/
{0x00,0x00,0x0c,0x52,0x52,0x52,0x3e,0x00},/*g*/
{0x00,0x00,0x7f,0x08,0x04,0x04,0x78,0x00},/*h*/
{0x00,0x00,0x00,0x44,0x7d,0x40,0x00,0x00},/*i*/
{0x00,0x00,0x40,0x40,0x44,0x3d,0x00,0x00},/*j*/
{0x00,0x00,0x7f,0x10,0x28,0x44,0x00,0x00},/*k*/
{0x00,0x00,0x00,0x41,0x7e,0x40,0x00,0x00},/*l*/
{0x00,0x00,0x7c,0x04,0x18,0x04,0x78,0x00},/*m*/
{0x00,0x00,0x7c,0x08,0x04,0x04,0x78,0x00},/*n*/
{0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00},/*o*/
{0x00,0x00,0x7c,0x14,0x14,0x14,0x08,0x00},/*p*/
{0x00,0x00,0x08,0x14,0x14,0x14,0x7c,0x00},/*q*/
{0x00,0x00,0x7c,0x08,0x04,0x04,0x08,0x00},/*r*/
{0x00,0x00,0x48,0x54,0x54,0x54,0x20,0x00},/*s*/
{0x00,0x00,0x04,0x3f,0x44,0x44,0x24,0x00},/*t*/
{0x00,0x00,0x3c,0x40,0x40,0x20,0x7e,0x00},/*u*/
{0x00,0x00,0x1c,0x20,0x40,0x20,0x1c,0x00},/*v*/
{0x00,0x00,0x3c,0x40,0x30,0x40,0x3c,0x00},/*w*/
{0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x00},/*x*/
{0x00,0x00,0x06,0x48,0x48,0x48,0x3e,0x00},/*y*/
{0x00,0x00,0x44,0x64,0x54,0x4c,0x44,0x00},/*z*/
{0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00},/*`*/
{0x00,0x00,0x00,0x42,0x7f,0x40,0x40,0x00},/*1*/
{0x00,0x00,0x62,0x51,0x51,0x49,0x46,0x00},/*2*/
{0x00,0x00,0x21,0x41,0x45,0x4b,0x31,0x00},/*3*/
{0x00,0x00,0x18,0x14,0x12,0x7f,0x10,0x00},/*4*/
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},/*5*/
{0x00,0x00,0x3c,0x4a,0x49,0x49,0x30,0x00},/*6*/
{0x00,0x00,0x01,0x71,0x09,0x05,0x03,0x00},/*7*/
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},/*8*/
{0x00,0x00,0x06,0x49,0x49,0x29,0x1e,0x00},/*9*/
{0x00,0x00,0x3e,0x51,0x49,0x45,0x3e,0x00},/*0*/
{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00},/*-*/
{0x00,0x00,0x14,0x14,0x14,0x14,0x14,0x00},/*=*/
{0x00,0x00,0x01,0x02,0x08,0x10,0x20,0x00},/*\\*/
{0x00,0x00,0x04,0x08,0x04,0x08,0x04,0x00},/*~*/
{0x00,0x00,0x00,0x00,0x4f,0x00,0x00,0x00},/*!*/
{0x00,0x00,0x3e,0x59,0x55,0x79,0x3e,0x00},/*@*/
{0x00,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00},/*#*/
{0x00,0x00,0x24,0x2a,0x7f,0x2a,0x12,0x00},/*$*/
{0x00,0x00,0x23,0x13,0x08,0x62,0x61,0x00},/*%*/
{0x00,0x00,0x04,0x02,0x01,0x02,0x04,0x00},/*^*/
{0x00,0x00,0x36,0x49,0x55,0x22,0x50,0x00},/*&*/
{0x00,0x00,0x14,0x08,0x3e,0x08,0x14,0x00},/***/
{0x00,0x00,0x00,0x1c,0x22,0x41,0x00,0x00},/*(*/
{0x00,0x00,0x00,0x41,0x22,0x1c,0x00,0x00},/*)*/
{0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x00},/*_*/
{0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00},/*+*/
{0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00},/*|*/
{0x00,0x00,0x00,0x7f,0x41,0x41,0x00,0x00},/*[*/
{0x00,0x00,0x00,0x41,0x41,0x7f,0x00,0x00},/*]*/
{0x00,0x00,0x00,0x56,0x36,0x00,0x00,0x00},/*;*/
{0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x00},/*'*/
{0x00,0x00,0x00,0x00,0x28,0x18,0x00,0x00},/*,*/
{0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00},/*.*/
{0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00},/*//*/
{0x00,0x00,0x00,0x08,0x36,0x41,0x00,0x00},/*{*/
{0x00,0x00,0x00,0x41,0x36,0x08,0x00,0x00},/*}*/
{0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00},/*:*/
{0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00},/*"*/
{0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x00},/*<*/
{0x00,0x00,0x00,0x41,0x22,0x14,0x08,0x00},/*>*/
{0x00,0x00,0x02,0x01,0x51,0x09,0x06,0x00}/*?*/
};
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void check_ram(void);//检测ram函数
/**********************************
液晶驱动函数
***********************************/
void lcdlon_off(uchar D);
void setlstartx(uchar D);
void setlstarty(uchar D);
void setlstartline(uchar D);
void lcdron_off(uchar D);
void setrstartx(uchar D);
void setrstarty(uchar D);
void setrstartline(uchar D);
void lcdlwrite(uchar D);
void lcdrwrite(uchar D);
uchar GetIndex(uchar szText);
void writelcd(void);
void initial_lcd(void);
void clear_lcd(void);
void full_lcd(void);
/**********************************
24c16驱动函数
**********************************/
void delay(uint8 time_nop);
void Start_I2c(void);
void Stop_I2c(void);
uint8 SendByte(uint8 c);
uint8 RcvByte(void);
void Ack_I2c(uint8 a);
uint8 ISendByte(uint8 sla,uint8 c);
uint8 ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no);
uint8 IRcvByte(uint8 sla,uint8 *c);
uint8 IRcvStr(uint8 sla,uint8 suba,uint8 *s,uint8 no);
void write_24lc16b(uint16 adrress, uint8 *wdata, uint8 number);
void read_24lc16b(uint16 adrress, uint8 *rdata, uint8 number);void check_24c16(void);//检测24c16函数
void intT0() interrupt 1 //T0 定时中断处理函数
{
TH0 = -2720/256; //定时器中断时间间隔 4ms
TL0 = -2720%256;
leddisp(); //每次定时中断显示更新一次
if(control_readkey == 1) //每两次定时中断扫描一次键盘
{
readkey();
}
control_readkey = !control_readkey;
}
void main(void)
{
TMOD = 0x01; //
TH0 = -2720/256; //定时器中断时间间隔 4ms
TL0 = -2720%256;
TCON = 0x10;
ET0 = 1;
EA = 1;
initial_lcd();//初始化液晶
while(1)
{
if(getkey == 1) //判断是否获得有效按键
{
getkey = 0;
switch(keynum) //判断键值,对不同键值采取相应的用户定义处理方式
{
case 0x0f: //当按下第二行最后一列按键时检测RAM,损毁单元数量使用数码管后五位显示
check_ram();
break;
case 0x0e: ////当按下第二行倒数第二列按键时检测FLASH,损毁单元数量使用数码管后四位显示
EA = 0;
check_24c16();
EA = 1;
break;
case 0x0d: //当按下第二行倒数第三列按键时 ,液晶屏被全部填充为黑
full_lcd();
break;
case 0x0c:
clear_lcd(); //当按下第二行倒数第四列按键时,液晶屏被全部清空
break;
default:
led[0] = keynum; //当按下其他按键时,全部数码管显示按键值
led[1] = keynum;
led[2] = keynum;
led[3] = keynum;
led[4] = keynum;
led[5] = keynum;
led[6] = keynum;
led[7] = keynum;
break;
}
}
}
}
/***************************************************
键盘扫描函数
原型: void readkey(void);
功能: 当获得有效按键时,令getkey=1,keynum为按键值
****************************************************/
void readkey(void)
{
uchar M_key = 0;
first_row = 0;
second_row = 0;
M_key = KEY;
if(M_key != 0xff) //如果有连续两次按键按下,认为有有效按键按下。消除按键抖动
{
if(first_getkey == 0)
{
first_getkey = 1;
}
else //当有有效按键按下时,进一步识别是哪一个按键
{
if(keyon == 0) //防止按键冲突,当还有未释放的按键时不对其它按键动作响应
{
first_row = 0; //扫描第一行按键
second_row = 1;
M_key = KEY;
if(M_key != 0xff)
{
switch(M_key)
{
case 0xfe:
keynum = 0x00;
break;
case 0xfd:
keynum = 0x01;
break;
case 0xfb:
keynum = 0x02;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -