📄 pg240128.c
字号:
/* Rizeni disple PG240x128 s digitalnim touch screenem
Displej je namapovan do pameti procesoru 8051 a zobrazena data jsou ulozena do externi pameti EPROM.
Graficky panel Verze 1.0
T_xx - rizeni digitalniho touch panelu
*/
#include <AT89x051.H>
#include <absacc.h> // knihovna pro externi primou adresaci prikaz XBYTE
sbit CD = P3^4;
sbit RESET = P3^5;
#define CITAC_H = 0x0e8;
#define CITAC_L = 0;
sbit T_R1 = P3^0;
sbit T_R2 = P3^1;
sbit T_R3 = P3^2;
sbit T_R4 = P3^3;
sbit T_R5 = P3^4;
sbit T_C1 = P1^0;
sbit T_C2 = P1^1;
sbit T_C3 = P1^2;
sbit T_C4 = P1^3;
sbit T_C5 = P1^4;
sbit T_C6 = P1^5;
sbit T_C7 = P1^6;
sbit T_C8 = P1^7;
sbit T_C9 = P3^6;
sbit T_C10 = P3^7;
unsigned char Delicka;
unsigned char Status;
bit Zobr_hod;
unsigned char Dotyk;
// write_d write data to LCD
void write_d(unsigned char Data) {
CD = 1;
do {
Status = XBYTE [0xFFFF]; // wait for STA1 = 0
}
while ((Status & 0x03) == 0);
CD = 0;
XBYTE [0xFFFF] = Data;
}
// write_c - write command to LCD
void write_c(unsigned char Data) {
CD = 1;
do {
Status = XBYTE [0xFFFF]; // wait for STA0 = 0
}
while ((Status & 0x03) == 0);
XBYTE [0xFFFF] = Data;
}
// write_auto - auto write data to LCD
void write_auto(unsigned char Data) {
CD = 1;
do {
Status = XBYTE [0xFFFF];
}
while ((Status & 0x08) == 0); // wait for STA3 = 0
CD = 0;
XBYTE [0xFFFF] = Data;
}
unsigned char Hod;
unsigned char Min;
unsigned char Sec;
void hodiny(void){
if (Sec == 60){
Sec = 0;
Min++;}
if (Min == 60){
Min = 0;
Hod++;}
if (Hod == 24) Hod = 0;
}
void zobr_hodiny() {
unsigned char Zobr;
write_d(111); write_d(0); write_c(0x24);
write_c(0xB0);
Zobr = Hod / 10;
write_auto(Zobr + 0x10);
Zobr = Hod % 10;
write_auto(Zobr + 0x10);
write_auto(':' - 0x20);
Zobr = Min / 10;
write_auto(Zobr + 0x10);
Zobr = Min % 10;
write_auto(Zobr + 0x10);
write_auto(':' - 0x20);
Zobr = Sec / 10;
write_auto(Zobr + 0x10);
Zobr = Sec % 10;
write_auto(Zobr + 0x10);
write_c(0xB2);
}
void touch(void){
int i;
ET0 = 0;
P1 = 0xFF;
T_R1 = 1;
T_R2 = 1;
T_R3 = 0;
T_R4 = 0;
T_R5 = 0;
for (i=0;i<100;i++);
if (!T_C1) Dotyk = 1;
if (!T_C2) Dotyk = 2;
if (!T_C3) Dotyk = 3;
if (!T_C4) Dotyk = 4;
if (!T_C5) Dotyk = 5;
if (!T_C6) Dotyk = 6;
if (!T_C7) Dotyk = 7;
if (!T_C8) Dotyk = 8;
if (!T_C9) Dotyk = 9;
if (!T_C10) Dotyk = 10;
P1 = 0xFF;
P3 = 0xFF;
ET0 = 1;
}
void casovac(void) interrupt 3 {
TH1 = 0x0e6;
Delicka--;
if (Delicka==0) {
Sec++;
Delicka = 200;
hodiny();
if (Zobr_hod) zobr_hodiny();
}
}
void cleargrf_ram(void) {
int i;
write_c(0x0b0); // Data Auto Write Set
for(i = 0; i < 0xf00; i++) write_auto(0x00);
write_c(0x0b2); // Auto Reset
}
void cleartxt_ram(void){
unsigned int i;
write_c(0xB0);
write_d(0); write_d(0); write_c(0x24);
for (i=0;i < 480;i++) write_auto(' ' - 0x20);
write_c(0xB2);
}
void init_dis(void) {
write_d(0); write_d(2); write_c(0x42); //Graphic Home address
write_d(0x1e); write_d(0); write_c(0x43); // bytes per line
write_d(0x00); write_d(0x00); write_c(0x40); // text home address
write_d(0x1e); write_d(0); write_c(0x41); // bytes per line
write_c(0x81); // mode set CGram, "GR or Tx"
write_d(0x2); write_d(0); write_c(0x22); // Offset registr
write_c(0x9C);
write_d(0); write_d(0); write_c(0x24); // Address Pointer = home positoin
cleartxt_ram();
write_d(0); write_d(2); write_c(0x24); // Address Pointer = home positoin
cleargrf_ram();
}
void datum(void){
write_d(46); write_d(0); write_c(0x24);
write_c(0xB0);
write_auto('2' - 0x20);
write_auto('2' - 0x20);
write_auto('.' - 0x20);
write_auto('0' - 0x20);
write_auto('9' - 0x20);
write_auto('.' - 0x20);
write_auto('2' - 0x20);
write_auto('0' - 0x20);
write_auto('0' - 0x20);
write_auto('1' - 0x20);
write_c(0xB2);
}
void obr1(void) {
unsigned int i;
unsigned char Data;
/* write_d(0x91); write_d(0x01); write_c(0x24);
write_c(0xB0);
write_auto('D' - 0x20);
write_auto('o' - 0x20);
write_auto('t' - 0x20);
write_auto('k' - 0x20);
write_auto('n' - 0x20);
write_auto('i' - 0x20);
write_auto('s' - 0x20);
write_auto('e' - 0x20);
write_c(0xB2);*/
write_d(0); write_d(2); write_c(0x24);
write_c(0xB0); // Data Auto Write Set
for (i=0;i < 3840;i++) {
Data = XBYTE [i];
write_auto(Data);
}
write_c(0xB2);
}
void obr2(void) {
unsigned int i;
unsigned char Data;
init_dis();
datum();
/* write_d(0x9b); write_d(0x01); write_c(0x24);
write_c(0xB0);
write_auto('V' - 0x20);
write_auto('y' - 0x20);
write_auto('d' - 0x20);
write_auto('e' - 0x20);
write_auto('j' - 0x20);
write_c(0xB2);*/
write_d(0); write_d(2); write_c(0x24);
write_c(0xB0); // Data Auto Write Set
for (i=0;i < 3840;i++) {
Data = XBYTE [i + 0xF00];
write_auto(Data);
}
write_c(0xB2);
Zobr_hod = 1;
}
void obr3(void) {
unsigned int i;
unsigned char Data;
init_dis();
write_d(0); write_d(2); write_c(0x24);
write_c(0xB0); // Data Auto Write Set
for (i=0;i < 3840;i++) {
Data = XBYTE [i + 0x1E00];
write_auto(Data);
}
write_c(0xB2);
}
void main(void){
unsigned char Sec_old;
bit Dotek;
RESET = 0;
Delicka = 200;
TH1 = 0xE6;
TL1 = 0;
TMOD = (TMOD & 0x0F) | 0x10; /* Set Mode (8-bit timer with reload) */
ET1 = 1; /* Enable Timer 1 Interrupts */
EA = 1;
TR1 = 1;
Zobr_hod = 0;
RESET = 1;
while (1) {
Dotek = 1;
Dotyk = 0;
init_dis();
obr1();
Sec_old = Sec;
while (Sec_old == Sec);
while (Dotek) {
touch();
if ((Dotyk > 3) & (Dotyk < 8)) Dotek = 0;
}
obr2();
Sec_old = Sec;
while (Sec_old == Sec);
Dotek = 1;
Dotyk = 0;
while (Dotek) {
touch();
if (Dotyk > 7) Dotek = 0;
}
Zobr_hod = 0;
obr3();
Sec_old = Sec;
while (Sec_old == Sec);
Dotek = 1;
Dotyk = 0;
while (Dotek) {
touch();
if (Dotyk > 0) Dotek = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -