📄 sy8.c
字号:
#include <c8051f000.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_CS=P3^0; //片选接口 低电平有效
sbit LCD_RES=P3^1; //单片机复位接口 低电平有效
sbit LCD_A0=P3^2; //数据/命令选择位 低电平命令 高电平数据
sbit LCD_SCK=P3^3; //时钟信号口 上升沿触发
sbit LCD_DA=P3^4; //数据信号口
void delay(uint i);
void sysclk_init();
void port_init();
float flash_re(uchar x);
void flash_wr(uchar x,float dat);
void lcd_send_data(uchar dat);
void lcd_send_cmd(uchar dat);
void lcd_init();
void lcd_set_page(uchar dat);
void lcd_set_colume(uchar dat);
void lcd_clr();
void lcd_point(uchar x,uchar y);
void lcd_display_one_num(uchar wordx,uchar wordy,uchar *n);
void lcd_word(uchar wordx,uchar wordy,uchar *word);
void lcd_display_num(uchar x,uchar y,float num);
//-------------------------------------------------------
//汉字字模
//每个汉字16X16 x+16 page+1 y+16
//-------------------------------------------------------
uchar code jia[]={0x02,0x02,0x3A,0xAA,0xAA,0xBE,0xAA,0xAA,0xAA,0xBE,0xAA,0xAA,0x3A,0x02,0x02,0x00,
0x00,0x80,0x80,0x5F,0x40,0x20,0x10,0x0E,0x10,0x20,0x60,0xDF,0x40,0x00,0x00,0x00};
uchar code zhi[]={0x00,0x08,0x08,0x08,0x08,0x08,0x09,0x0A,0x0C,0x88,0x48,0x28,0x1C,0x08,0x00,0x00,
0x20,0x60,0x30,0x08,0x18,0x24,0x24,0x22,0x41,0x40,0x40,0x40,0x40,0x40,0x40,0x00};
uchar code ye[]={0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00,
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00};
uchar code jing[]={0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00,
0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00};
uchar code shi[]={0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00};
uchar code yan[]={0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
0x08,0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00};
uchar code meng[]={0x40,0x44,0x24,0x14,0xFF,0x94,0x64,0x40,0x24,0x14,0xFF,0x0C,0x34,0x64,0x24,0x00,
0x00,0x80,0x88,0x88,0x46,0x45,0x29,0x31,0x11,0x09,0x05,0x03,0x01,0x00,0x00,0x00};
uchar code face[]={0xE0,0x10,0x0C,0x24,0x22,0x21,0x21,0x81,0x01,0x21,0x21,0x22,0x24,0x0C,0x10,0xE0,
0x07,0x08,0x30,0x20,0x40,0x88,0x90,0x97,0x94,0x90,0x88,0x40,0x20,0x30,0x08,0x07};
uchar * code zichuan[]={jia,meng,zhi,ye,jing,shi,yan,face};
//--------------------------------------------------------
//数字字模
//每个数字8X16 x+8 page+2 y+16
//--------------------------------------------------------
uchar code num0[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};
uchar code num1[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
uchar code num2[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};
uchar code num3[]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};
uchar code num4[]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};
uchar code num5[]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};
uchar code num6[]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};
uchar code num7[]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};
uchar code num8[]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};
uchar code num9[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};
uchar code dian[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};
uchar * code albnum[]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,dian};
void main()
{
uchar i;
sysclk_init();
port_init();
lcd_init();
lcd_clr(); //清屏
lcd_display_num(0,0,flash_re(0));//显示 读取FLASH中的数据
for(i=0;i<8;i++) //显示 贾梦之液晶实验 和一个 笑脸
{
lcd_word(16*i,2,zichuan[i]);
}
for(i=0;i<11;i++)
{
lcd_display_one_num(8*i,4,albnum[i]);
}
lcd_display_num(0,6,3.657);
flash_wr(0,8.14); //向flash中写数据
for(;;);
}
//--------------------------------------------
//显示10-0之间的小数 有效数字4位
//每个数字宽8 高16 带小数点共宽5位 40列
//x:数字列位置(0-87) y:数组行(页)(1-8) num:显示的数字(10-0之间的浮点数)
//--------------------------------------------
void lcd_display_num(uchar x,uchar y,float num)
{
lcd_display_one_num(x,y,albnum[(uchar)(num)]);
x+=8;
lcd_display_one_num(x,y,albnum[10]); //显示小数点
x+=8;
lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
x+=8;
lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
x+=8;
lcd_display_one_num(x,y,albnum[((uint)(num*=10))%10]);
}
//--------------------------------------------
//显示1个阿拉伯数字
//每个数字宽8 高16
//wordx:数字列位置(0-119) wordy:数组行(页)(1-8) num:显示的数字(10-0之间的浮点数)
//--------------------------------------------
void lcd_display_one_num(uchar wordx,uchar wordy,uchar *n)
{
uchar i;
lcd_set_page(wordy);
lcd_set_colume(wordx);
for(i=0;i<8;i++)
lcd_send_data(*(n+i));
lcd_set_page(wordy+1);
lcd_set_colume(wordx);
for(i=0;i<8;i++)
lcd_send_data(*(n+i+8));
}
void delay(uint i)
{
for(;i>0;i--);
}
void lcd_send_data(uchar dat)
{
uchar i;
LCD_CS=0; //片选选通
LCD_A0=1; //选择发送数据
LCD_SCK=1;
for(i=0;i<8;i++)
{
dat<<=1; //将要发送位送人CY寄存器
LCD_DA=CY; //发送CY中字节
LCD_SCK=0;
delay(10);
LCD_SCK=1; //时钟电平上升沿 数据位送给LCD
delay(10);
}
LCD_CS=1; //片选关
delay(20);
}
void lcd_send_cmd(uchar dat)
{
uchar i;
LCD_CS=0; //片选选通
LCD_A0=0; //选择发送命令
LCD_SCK=1;
for(i=0;i<8;i++)
{
dat<<=1; //将要发送位送人CY寄存器
LCD_DA=CY; //发送CY中字节
LCD_SCK=0;
delay(10);
LCD_SCK=1; //时钟电平上升沿 数据位送给LCD
delay(10);
}
LCD_CS=1; //片选关
delay(20);
}
void lcd_init()
{
LCD_RES=1;
delay(20000);
lcd_send_cmd(0xE2); //复位
lcd_send_cmd(0xA2); //d0:Set LCD drive voltage bias ratio 0=1/9bias 1=1/7bias
lcd_send_cmd(0xC8); //d3:select COM output direction 0=normal 1=reverse
lcd_send_cmd(0xA0); //d0:select SEG output direction 0=normal 1=reverse
lcd_send_cmd(0xA6); //d0:0=display normal 1=reverse
lcd_send_cmd(0xF8); //select booster ratio
lcd_send_cmd(0x00); //select booster ratio d0&d1:00=4x
lcd_send_cmd(0x2C); //d2:1=select internal power supply operating mode
lcd_send_cmd(0x2E);
lcd_send_cmd(0x2F);
lcd_send_cmd(0x81); //select the VO output voltage electronic volume register
lcd_send_cmd(0x14); //select the VO output voltage electronic volume register
lcd_send_cmd(0x0E); //select the VO output voltage electronic volume register
lcd_send_cmd(0xAF); //d0:LCD display ON=1/OFF=0
lcd_send_cmd(0xE0);
lcd_send_cmd(0x40); //Set the display RAM start line address
}
void lcd_set_page(uchar dat)
{
lcd_send_cmd(0xb0|dat);
}
void lcd_set_colume(uchar dat)
{
uchar tmp;
tmp=dat>>4;
lcd_send_cmd(0x10|tmp); //送列地址高四位
tmp=0x0f&dat;
lcd_send_cmd(tmp); //送列地址低四位
}
void lcd_clr()
{
uchar i,j;
for(i=0;i<8;i++)
{
lcd_set_page(i);
lcd_set_colume(0);
for(j=0;j<128;j++)
lcd_send_data(0x00);
}
}
//-------------------------------------------------------
//x:列(0-127) y:行(0-63)
//-------------------------------------------------------
void lcd_point(uchar x,uchar y)
{
lcd_set_colume(x); //设置列
lcd_set_page(y>>3); //设置页
lcd_send_data(1<<(0x07&y));
}
//-------------------------------------------------------
//每个汉字宽16 高2页
//
//wordx:汉字列位置(0-111) wordy:汉字行(0-8) word:字模数组名
//-------------------------------------------------------
void lcd_word(uchar wordx,uchar wordy,uchar *word)
{
uchar i;
lcd_set_page(wordy);
lcd_set_colume(wordx);
for(i=0;i<16;i++)
lcd_send_data(*(word+i));
lcd_set_page(wordy+1);
lcd_set_colume(wordx);
for(i=0;i<16;i++)
lcd_send_data(*(word+i+16));
}
void sysclk_init()
{
WDTCN=0XDE; //关看门狗
WDTCN=0XAD;
OSCICN=0x07; //内部16M时钟
}
void port_init()
{
XBR0=0X00; //CEX0,CEX1连接到端口
XBR1=0X00;
XBR2=0X40; //交叉开关允许
PRT0CF=0Xff; //P0口输出方式推挽
PRT1CF=0Xff; //P1口输出方式推挽
PRT2CF=0Xff; //P2口输出方式推挽
}
//----------------------------------------------
//向flash的128字节扇区写数据 扇区地址0x8000-0x807f
//dat 要存储的数据 x:存储在128字节扇区的第X字节
//----------------------------------------------
void flash_wr(uchar x,float dat)
{
float xdata *pwr=0x8000+8*x;//写指针
FLSCL=0x89;
PSCTL=0x03; //擦除允许 写允许
*pwr=1;
PSCTL=0x01; //写允许
*pwr=dat;
}
//----------------------------------------------
//读取flash的128字节扇区内容
//----------------------------------------------
float flash_re(uchar x)
{
float code *pre=0x8000+8*x;//读指针
return *pre;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -