高级会员

- 积分
- 800
- 金钱
- 800
- 注册时间
- 2011-11-18
- 在线时间
- 5 小时
|
发表于 2014-5-11 22:22:26
|
显示全部楼层
=。=!!
1602的驱动和原子的屏驱动都是用IBM的8080总线呀,只不过一个是8位的,一个是16位的。你主要找到两行的地址改一下就能用了。但注意通信频率要降下来。有些LCD两行的地址都有些不同的。
我以前都用1602,后来就越来越大,然后是1604,再然后是12864................我有一些以前的代码,但是是配STC的片片用的,你将就看 一下吧。
#include < STC12C5A60s2.h >
#include < intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit DQ =  3^3 ; //定义DS18B20端口DQ
sbit LCD_RS =  3^6 ;
sbit LCD_RW =  3^7 ;
sbit LCD_EN =  4^0 ;
sbit Buzz=P3^5;
bit presence ;
// 0 1 2 3 4 5 6 7 8 9 10
uchar code cdis[20][17]={{"A)  rinting "},{"C) Manual Adj. "},{"RLMotor Working "},{"SVMotor Working "},{"   rinting "},{" Setup Menu "},{" Data Saved "},{"Hight Sense ADj."},{" ulse: "},{" "},{" "},
// 11 12 13 14 15 16 17 18 19
{" Save Data? "},{" A)Yes B)No "},{"Material Ticknes"},{" --- Quit --- "},{"Front Offset Adj"},{"   H Hight ADj. "},{" rint Delay ADj."},{" Data Saved!!! "},{"D) Exit Menu "}};
// 0 1 2 3 4 5 6 7 8 9 10 11
uchar code cdis_add[20][17]={{" "},{" wait for Order "},{"  rinting Done "},{"O) Continue "},{" Hight set "},{" Manual "},{"Printing Standby"},{" Printing Done "},{"D) Exit Menu "},{"B) Setup Menu "},{"--Front Moving--"},{"--Back Moving--"}
// 12 13 14 15 16 17 18 19
,{"-- Up Moving --"},{"--Down Moving--"},{"B) My Position "},{"C) Home Way Stup"},{"D) -- Recess -- "},{" D) For Get Up "},{" --Change to-- "},{"O) Quit "}};
extern uchar IRCOM[4];
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
void IR_init(void);
void delay_ms(uint n);
/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/******************************************************************/
bit lcd_busy()
{
bit result ;
LCD_RS = 0 ;
LCD_RW = 1 ;
LCD_EN = 1 ;
delayNOP() ;
result = (bit)(P2&0x80) ;
LCD_EN = 0 ;
return(result) ;
}
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS = 0 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P2 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P2 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
delay1(50) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
delay1(50) ;
lcd_wcmd(0x38) ;
delay1(50) ;
lcd_wcmd(0x38) ;
delay1(50) ;
lcd_wcmd(0x0c) ; //显示开,关光标
delay1(50) ;
lcd_wcmd(0x06) ; //移动光标
delay1(50) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay1(50) ;
}
/* 设定显示位置 */
/*******************************************************************/
void lcd_pos(uchar pos)
{
// if(pos<15)
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
// else
// lcd_wcmd((pos-15) | 0xc0) ;
}
//*********************************************************************/
void lcd_show(uchar A,uchar b,uchar c) //
{
uchar i,j;
if ((A>20)&(A<99))
{
lcd_pos(b);
delay_ms(5);
for (i=0;i<A-20;i++)
{
lcd_wdat(c);
delay_ms(5);
}
}
if (A><20)
{
i=0;
lcd_pos(b);
delay_ms(5);
while(cdis[A] != '\0')//
{ //显示字符 void
lcd_wdat(cdis[A]) ;
delay_ms(5);
i++ ;
}
i=0;
}
if (A>100)
{
i=0,j=0;
j=A-100;
lcd_pos(b);
delay_ms(5);
while(cdis_add[j] != '\0')//
{ //显示字符 void
lcd_wdat(cdis_add[j]) ;
delay_ms(5);
i++ ;
}
i=0;
}
} |
|