📄 lcd12232.c
字号:
/*************************************************
TMS430F149 LCD122x32 驱动程序( Ver 1.0 )
2007/10/15 王昊民
**************************************************/
#pragma language=extended
#include <msp430x14x.h>
#include <stdio.h>
// #include <rtc.h>
#include "zk.h"
#define LCD_left_E1() {P1OUT|=0x20;P1OUT&=~0x10;} // P1.5=CS1
#define LCD_right_E2() {P1OUT|=0x10;P1OUT&=~0x20;} // P1.4=CS2
#define LCD_no_E1E2() {P1OUT&=~0x30;}
#define LCD_pin_rd() {P1OUT|=0x80;} // P1.7=R/W
#define LCD_pin_wt() {P1OUT&=~0x80;}
#define LCD_pin_dat() {P1OUT|=0x40;} // D/I=P1.6
#define LCD_pin_cmd() {P1OUT&=~0x40;}
#define LCD_LEFT 0
#define LCD_RIGHT 1
#define LCD_CMD 0
#define LCD_DAT 1
INT16U LCD_rd(INT16U left_righr,INT16U data_cmd);
void LCD_wt_char(INT16U data_cmd,INT16U left_righr,INT16U c);
void LCD_on();
void LCD_off();
void LCD_wt_byte(INT16U x,INT16U y,INT16U c);
void LCD_clear();
void LCD_black();
void Lprint_asc(INT16U x,INT16U y,char c,INT16U md);
void Lprint_hz(INT16U x,INT16U y,INT16U c,INT16U md);
void Lprint(INT16U x,INT16U y,char const *str,INT16U md);
INT16U hz_seek(INT16U s);
void delay(INT16U i);
void LCD_wt(INT16U data_cmd,INT16U left_righr,INT16U c)
{
/***************************
i=0x80;
while((i&0x80)!=0){
if(left_right==LCD_LEFT)
i=LCD_rd(LCD_LEFT,LCD_CMD_ADDR);
else
i=LCD_rd(LCD_RIGHT,LCD_CMD_ADDR);
}
读状态似乎有问题,暂时不管了
**************************/
LCD_no_E1E2();
delay(1);
LCD_pin_wt();
if(data_cmd==LCD_CMD) // D/I
LCD_pin_cmd()
else
LCD_pin_dat();
delay(3);
if (left_righr==LCD_LEFT) // E1/E2
LCD_left_E1()
else
LCD_right_E2();
delay(1);
P2DIR = 0xFF; // P2 to output
P2OUT = c;
delay(1);
LCD_no_E1E2();
delay(2);
P2DIR = 0x00; // P2 to input
}
INT16U LCD_rd(INT16U left_right,INT16U data_cmd)
{INT8U c;
c=0;
LCD_no_E1E2();
P2DIR = 0x00; // P2 to input
delay(1);
LCD_pin_rd();
delay(3);
if(data_cmd==LCD_CMD) // D/I address
LCD_pin_cmd()
else
LCD_pin_dat();
delay(3);
if (left_right==LCD_LEFT) // E1/E2
LCD_left_E1()
else
LCD_right_E2();
P2OUT=0xFF ;
delay(2);
c= P2IN ; // read P2
LCD_no_E1E2();
delay(2);
return c&0xFF;
}
void LCD_on()
{
P5OUT|=0x2; // LCD POWER P5.1
P4OUT&=~0x2; // 245 pin P4.1
delay(5000);
LCD_wt(LCD_CMD,LCD_LEFT,0xAF); // LCD on
LCD_wt(LCD_CMD,LCD_RIGHT,0xAF);
LCD_wt(LCD_CMD,LCD_LEFT,0xE2); // LCD reSet
LCD_wt(LCD_CMD,LCD_RIGHT,0xE2);
LCD_wt(LCD_CMD,LCD_LEFT,0xA4); // LCD normal
LCD_wt(LCD_CMD,LCD_RIGHT,0xA4);
LCD_wt(LCD_CMD,LCD_LEFT,0xA9); // LCD 1/32 duty
LCD_wt(LCD_CMD,LCD_RIGHT,0xA9);
//LCD_wt(LCD_CMD,LCD_LEFT,0xE0); // LCD read modify write mode
//LCD_wt(LCD_CMD,LCD_RIGHT,0xE0);
}
void LCD_off()
{
LCD_wt(LCD_CMD,LCD_LEFT,0xAE);
LCD_wt(LCD_CMD,LCD_RIGHT,0xAE);
delay(255);
P5OUT&=~0x2; // LCD POWER P5.1
P4OUT|=0x2; // 245 pin P4.1
}
void LCD_wt_byte(INT16U x,INT16U y,INT16U c)
{
if(x>121) return;
if(y>3) return;
if(x<=60){
LCD_wt(LCD_CMD,LCD_LEFT,0xC0);
LCD_wt(LCD_CMD,LCD_LEFT,0xB8+y);
LCD_wt(LCD_CMD,LCD_LEFT,0x00+x);
LCD_wt(LCD_DAT,LCD_LEFT,c);
}
else{
LCD_wt(LCD_CMD,LCD_RIGHT,0xC0);
LCD_wt(LCD_CMD,LCD_RIGHT,0xB8+y);
LCD_wt(LCD_CMD,LCD_RIGHT,0x00+x-61);
LCD_wt(LCD_DAT,LCD_RIGHT,c);
}
}
void LCD_clear()
{INT16U i,j;
for(i=0;i<4;i++)
for(j=0;j<122;j++)
LCD_wt_byte(j,i,0x00);
}
void LCD_black()
{INT16U i,j;
for(i=0;i<4;i++)
for(j=0;j<122;j++)
LCD_wt_byte(j,i,0xFF);
}
void Lprint_asc(INT16U x,INT16U y,char c,INT16U md)
{INT16U i;
INT8U const *p;
if(x>121) return;
if(y>3) return;
p=&zu_asc[c*16];
for(i=0;i<8;i++){
c=*p++;
if(md==1) c=~c;
LCD_wt_byte(x+i,y,c);
c=*p++;
if(md==1) LCD_wt_byte(x+i,y+1,~c);
else if(md==2) LCD_wt_byte(x+i,y+1,c|0x80);
else LCD_wt_byte(x+i,y+1,c);
}
}
void Lprint_hz(INT16U x,INT16U y,INT16U c,INT16U md)
{INT16U i;
INT8U const *p;
if(x>121) return;
if(y>3) return;
p=&zk_hz[c];
for(i=0;i<16;i++){
c=*p++;
if(md==1) c=~c;
LCD_wt_byte(x+i,y,c);
c=*p++;
if(md==1) LCD_wt_byte(x+i,y+1,~c);
else if(md==2) LCD_wt_byte(x+i,y+1,c|0x80);
else LCD_wt_byte(x+i,y+1,c);
}
}
void Lprint(INT16U x,INT16U y,char const *str,INT16U md)
{INT16U n,t;
y*=2;x*=8;
if(x>121) return;
if(y>3) return;
n=0;
while((*str)!=0){
if(n++>15) break;
if(*str<128){ // is ASC
Lprint_asc(x,y,*str++,md);
x+=8;
}
else{
t=(str[0]<<8)+str[1]; // 中文内码: 2 bytes
str+=2;
t=hz_seek(t);
Lprint_hz(x,y,t,md);
x+=16;
}
}
}
INT16U hz_seek(INT16U s)
{INT16U i,n,c;
INT8U const *p;
c=0;
p=zk_hz;
n=sizeof(zk_hz);
n=n/34;
for(i=0;i<n;i++){
if(s==((p[0]<<8)+p[1])){
c=i*34+2;
break;
}
p+=34;
}
return c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -