单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)
這幾天我又對(duì)程序進(jìn)行了修改——將AD檢測(cè)過(guò)程與屏幕刷新過(guò)程分離,大大提高了檢測(cè)速度。(此外我將程序修改為5秒自動(dòng)刷新,以方便觀察。)
修改后的main.c如下。
#include #include"XPT2046.h"
#define uint unsigned int
#define uchar unsigned char
uchar xdata a[128];
sbit RS=P2^6; //這個(gè)是LCD的數(shù)據(jù)命令選擇端
sbit RW=P2^5; //這個(gè)是LCD的寫(xiě)入或是讀出選擇端
sbit RST=P1^0; //這個(gè)是LCD的復(fù)位端口
sbit LCDE=P2^7; // 這個(gè)是LCD的使能端
sbit PSB=P3^2;
void delay(uchar i)
{
while(i--);
}
void delayms(uint c)? ?//誤差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void lcd_busy()
{
RS=0;
RW=1;
P0=0XFF;
LCDE=1;
delay(14);
while((P0&0x80)==0x80);
LCDE=0;
}
void write_com(uchar com)
{
lcd_busy();RS=0;
RW=0;
LCDE=0;
P0=com;
delay(9);
LCDE=1;
delay(9);
LCDE=0;
}
void write_num(uchar num)
{
lcd_busy();
RS=1;
RW=0;
LCDE=0;
P0=num;
delay(7);
LCDE=1;
delay(9);
LCDE=0;
}
uchar read_data()
{
uchar read;
lcd_busy();
RS=1;
RW=1;
LCDE=0;
delay(7);
LCDE=1;
delay(9);
read=P0;
LCDE=0;
delay(11);;
return read;
}
void clear_lcd()
{
uchar i,j;
write_com(0x34);
for(i=0;i<32;i++)? ?? ?? ?? ? //因?yàn)長(zhǎng)CD有縱坐標(biāo)32格所以寫(xiě)三十二次
{
write_com(0x80+i);? ?? ?? ?//先寫(xiě)入縱坐標(biāo)Y的值
write_com(0x80);? ?? ?? ?//再寫(xiě)入橫坐標(biāo)X的值
for(j=0;j<32;j++)? ?? ?? ?//橫坐標(biāo)有16位,每位寫(xiě)入兩個(gè)字節(jié)的的數(shù)據(jù),也就寫(xiě)入32次
{? ?? ?? ?? ?? ?? ?? ?? ? //因?yàn)楫?dāng)寫(xiě)入兩個(gè)字節(jié)之后橫坐標(biāo)會(huì)自動(dòng)加1,所以就不用再次寫(xiě)入地址了。
write_num(0x00);
}
}
write_com(0x36);
write_com(0x30);
}
void put_point(uchar x,uchar y)
{
uint bt=0,read=0;
uchar x_adr,y_adr,h_bit,l_bit;
y_adr=0x80+y2;? ?? ?? ?? ?//計(jì)算Y軸的地址,應(yīng)為縱坐標(biāo)有64個(gè),所有對(duì)32求余,當(dāng)Y大于31時(shí),Y的坐標(biāo)是下半屏的。
if(y>31) //計(jì)算X軸的地址當(dāng)Y大于31時(shí)X的地址在下半屏,從0X88開(kāi)始,小于31時(shí)X的地址是在上半屏,從0X80開(kāi)始
x_adr=0x88+x/16;
else
x_adr=0x80+x/16;
bt=0x8000>>(x); //求這個(gè)點(diǎn)到底是在哪個(gè)點(diǎn)
write_com(0x34);
write_com(0x34);
write_com(y_adr);? ???//讀取數(shù)據(jù)的時(shí)候要先寫(xiě)入所取數(shù)據(jù)的地址
write_com(x_adr);
read_data();? ?? ?? ?//讀取的第一個(gè)字節(jié)不要,
read=read_data();? ???//從第二個(gè)字節(jié)開(kāi)始接收。
read<<=8;
read|=read_data();
bt=bt|read;
h_bit=bt>>8;
l_bit=bt;
write_com(y_adr);? ???//寫(xiě)入點(diǎn)的時(shí)候,重新寫(xiě)入地址,因?yàn)榈刂芬呀?jīng)改變。
write_com(x_adr);
write_num(h_bit);
write_num(l_bit);
write_com(0x36); //開(kāi)顯示
write_com(0x30);? ???//轉(zhuǎn)回基本指令集
}
/*
液晶初始化
*/
void lcd_init()
{
PSB=1;
RST=1;
write_com(0x30);? ???//基本指令操作
write_com(0x0c);? ???//開(kāi)顯示
write_com(0x01);? ???//清除LCD顯示
}
void main()
{
while(1)
{
uchar x,i,y;
lcd_init();
clear_lcd();
write_com(0x34);
write_com(0x34);
write_com(0x80);
write_com(0x88);
for(i=16;i>0;i--) //畫(huà)出X軸
{
write_num(0xff);
}
for(i=0;i<64;i++) //畫(huà)出Y軸
{
put_point(0,i);
}
for(i=0;i<128;i++)
{
a[i] = Read_AD_Data(0xE4);
}
for(i=0;i<128;i++)
{
x=i;
y=32-(a[i]/10);
put_point(x,y);
}
write_com(0x36);
write_com(0x30);
delayms(5000);
}
}
總結(jié)
以上是生活随笔為你收集整理的单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 响应式织梦模板旅游公司类网站
- 下一篇: 语音模型