📄 12232.c
字号:
// DDRA = 0x00; //PA口输入
lcd_data = 0xff;
clr_A0(); //指令
set_WR(); //读
NOP(); NOP();
while(lcd_data & status_busy); //读入LCD状态,1=忙,一直等待LCD内部操作完成
// DDRA = 0xff; //重新置PA口输出
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_init(void)
//函数说明:122x32LCD初始化,开机后仅调用一次
////////////////////////////////////////////////////////////////////////////////
void lcd_init(void)
{
send_mi(reset); //复位m-left,s-right
send_si(reset);
send_mi(disp_off); //关闭显示
send_si(disp_off);
send_mi(dynamic_driver); //动态驱动
send_si(dynamic_driver);
send_mi(clk32); //1/32占空比
send_si(clk32);
send_mi(adc_select); //clockwise
send_si(adc_select);
//send_mi(mode_write); //写模式
//send_si(mode_write);
send_mi(col_addr_set);
send_mi(disp_start_line); //归回零列,设定显示起始行首
send_si(col_addr_set);
send_si(disp_start_line);
send_mi(disp_on); //开显示
send_si(disp_on);
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_clr(void)
//函数说明:清屏
////////////////////////////////////////////////////////////////////////////////
void lcd_clr(void)
{
uchar i, page;
for (page=0;page<4;page++)
{
send_mi(page_addr_set+page);
send_si(page_addr_set+page);
for (i=0;i<122;i++) //若为62则中间可能有条竖线
{ send_mi(i); //主窗口设置为0列
send_si(i); //从窗口设置为0列
send_md(0);
send_sd(0);
}
}
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void set_page(uchar page)
//函数说明:同时设置主(右)从(左)显示页为0-3页
////////////////////////////////////////////////////////////////////////////////
void set_page(uchar page)
{
send_mi(page_addr_set|page);
send_si(page_addr_set|page);
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void SetAddress(uchar address)
//函数说明:同时设置主(右)从(左)列地址为0-61列
////////////////////////////////////////////////////////////////////////////////
void set_address(uchar address)
{
send_mi(address&0x7F); //&0x7F,考虑到防止越限
send_si(address&0x7F);
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_l(uchar c)
//函数说明:在右页(从窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_l(uchar c)
{
send_md(c);
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_r(uchar c)
//函数说明:在左页(主窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_r(uchar c)
{
send_sd(c);
}
////////////////////////////////////////////////////////////////////////////////
//调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
//函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
// bmp是图形指针
// 使用zimo21软件,采用纵向取模下高位得到bmp数据。
// col 图型的起始位置0~121
// layer 图形的位置(Y坐标)0-下半部分 非0-上半部分
// width 图形宽度8,16可选
// bmp 图形数据指针
////////////////////////////////////////////////////////////////////////////////
void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
{
uchar x;
uchar address; //address表示显存的物理地址
uchar p=0;
uchar page=0;
uchar window=0; //page表示上下两页,window表示左右窗口(0左,1右)
if (layer) page=2; //左-主窗口,右-从窗口
for (x=col; x<col+width; x++)
{
if (x>121)return; //防止显示乱码
if (x>60) //左右窗口定位
{
window=1; //右-从窗口
address=x%61;
}
else
address=x; //主窗口输出
set_page(page); //上层数据输出
set_address(address);
if (window)
putchar_r(bmp[p]);
else
putchar_l(bmp[p]);
set_page(page+1); //下层数据输出
set_address(address); //列保持不变
if (window)
putchar_r(bmp[p+width]);
else
putchar_l(bmp[p+width]);
p++;
}
}
////////////////////////////////////////////////////////////////////////////////
//函数:void disp_one_ascii(uchar col,uchar layer,uchar ascii_code)
//说明:显示单个ASCII码col-列;layer-上下行:1-上,0-下;ascii_code:所要显示德ASCCII码
////////////////////////////////////////////////////////////////////////////////
void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode)
{
uchar i;
for(i=0;i<16;i++) //ASCII码显示占用16个字节
{
if(mode)dot_buffer[i]=~ascii[(ascii_code-0x20)*16 + i];
else dot_buffer[i]= ascii[(ascii_code-0x20)*16 + i];
}
draw_bmp(col,layer,8,dot_buffer);
}
////////////////////////////////////////////////////////////////////////////////
//函数:void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
//说明:显示小于4个的十进制数字//修改缓冲区的大小可以扩展显示
////////////////////////////////////////////////////////////////////////////////
void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
{
while(n--)
{
if(mode)disp_one_ascii(col,layer,disp_buffer[n]+0x30,1);
else disp_one_ascii(col,layer,disp_buffer[n]+0x30,0);
col += 8;
}
}
////////////////////////////////////////////////////////////////////////////////
//函数:void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
//说明:ASCII(8*16) 和 汉字(16*16)显示函数
////////////////////////////////////////////////////////////////////////////////
void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
{
uchar c1,c2;
uchar i,j,k;
uchar ulen;
//uchar ucol,ulayer,umode;
uchar ucol,ulayer;
ulen = 0;
ucol = col;
ulayer = layer;
while (ptr[ulen]!= 0)ulen++; //探测字串长度
i=0;
while(i<ulen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ASCII字符与汉字内码的区别在于128做分界;大于128的为汉字码
if(c1 <=128) //ASCII
{
if(mode)disp_one_ascii(ucol,ulayer,c1,1);
else disp_one_ascii(ucol,ulayer,c1,0);
ucol+=8;
i++; //ASCII码的处理
}
else //中文
{
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{ //查找定位当前汉字的点阵区
if((c1 == GB_16[j].Index[0]) && (c2 == GB_16[j].Index[1]))
break;
}
for(k=0;k<32;k++)
{ if(mode)dot_buffer[k]=~GB_16[j].Msk[k];
else dot_buffer[k]= GB_16[j].Msk[k];
}
draw_bmp(ucol,ulayer,16,dot_buffer);
ucol+=16;
i+=2; //中文的处理
}
}
}
void delay(uint x) ////when crystal is 12M ,a*2+5 us ,子程序调用要5us,while 就等于DJNZ指令
{
while (x--);
}
bit reset(void) //初始化18B20
{
bit presence=0; //定义一个应答信号
DQ=1;
DQ=0;
delay(80); //置总线为低电平并保持至少480us
DQ=1; //等电阻拉高总线并保持15-60us
delay(5);
presence=DQ; //接受应答信号
delay(13); //延时60-240us
return(presence); //返回应答信号
}
/* 从DS18B20读出1个字节 */
uchar read_byte(void) //从18b20读一个字节.返回读到的内容
{
uchar i,j;
j=0;
for(i=0;i<8;i++)
{
j=j>>1;
DQ=0;
_nop_(); //要求>1us,但又不能超过15us
_nop_();
DQ=1; //释放总线
_nop_();
_nop_();
if(DQ)
j|=0x80;
delay(30);
}
return (j);
}
void write_byte(uchar val) //向DS18B20写入1个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_(); //要求>1us,但又不能超过15us
_nop_();
if(0x01&val)
DQ=1;
delay(30); //要求总时间在60-120us
DQ=1; //释放总线
_nop_(); //要求>1us
val=val>>1;
}
}
/* 读取温度子程序 */
get_temperature(void)
{
uchar msb;//高8位
uchar lsb;//低8位
reset(); /* 发送复位信号 */
delay(20);
write_byte(0xcc); /* 跳过ROM */
write_byte(0x44); /* 发送转换温度命令 */
reset();
delay(14);
write_byte(0xcc);
write_byte(0xBE); /* 发送读memory命令 */
lsb =read_byte();
msb =read_byte();
reset();
if((msb&0xF0)>0) { flag=1;msb=~msb; lsb=~lsb+1;}//如果为负温度取反加1
else flag=0;
table[0]=(msb<<4)|(lsb&0>>4);
table[1]=((lsb<<4)*5)/128;// 小数点后两位.可做到后4位即0.0625为单位
}
main ()
{
get_temperature();
while(1)
{
get_temperature();
if (flag)
{
;
}
delay(10000);
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/*
void main(void)
{
char i;
uint j;
// DDRC=0xF0; //C口高四位为输出控制端口
// DDRA=0xFF; //A口为数据线(一般为输出,仅在读LCD状态时为输入)
for(i=0;i<10;i++);
for(j=1;j<10;j++); //开机延时
lcd_init();
lcd_clr();
while(1)
{
for(i=121;i>0;i--) //往左滚动输出
{
lcd_clr();
dprintf((i+24),1,"太川单片机 欢迎光临",0);//第二步,调整数据使它达到要求10个空格刚刚好在中间
dprintf((i-96),0,"单 HTTP://TCMCU.ICPCN.COM",0);
//第一步,调整I-x使最后出现的达到要求,第一个字出现在后面也不要紧
delay_ms(200);
}
delay_ms(3000);
lcd_clr();
delay_ms(3000);
for(i=121;i>0;i--) //往左滚动输出
{
lcd_clr();
dprintf((i+24),1,"太川单片机",0);
dprintf(i,0,"电话:028-66021915",1);
delay_ms(200);
}
delay_ms(1000);
lcd_clr();delay_ms(200);
dprintf(24,1,"太川单片机",0);
dprintf(0,0,"电话:028-66021915",1);
delay_ms(200);
lcd_clr();delay_ms(200);
dprintf(24,1,"太川单片机",0);
dprintf(0,0,"电话:028-66021915",1);
delay_ms(200);
lcd_clr();delay_ms(200);
dprintf(24,1,"太川单片机",0);
dprintf(0,0,"电话:028-66021915",1);
delay_ms(200);
lcd_clr();
delay_ms(200);
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -