📄 1335c51.lst
字号:
595 4 }
596 3 break;
597 3 }
598 2 tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
599 2 Optr++;
600 2 }
601 1 }
602 /*
603 void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) {
604
605 Uint tempPtr,Optr;
606 Uchar tempCount1,tempCount2,nByte;
607
608 Optr = (Uint)Oy * paraP9 + Ox;
609 nByte = DotWidth/8;
610 WriteCommand( CsrDirD ); // 自动右移。
611
612
613 if(attribs)Optr += BasePart2*256;
614 WriteCommand( CsrW ); // 光标定位指令
615 WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
616 WriteData( (Uchar)(Optr /256 ) );
617 WriteCommand( mWrite ); // ram写指令
618
619
620 for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
621 WriteData( Cdotlib[Cnumber].Msk[tempCount2*2] ); // 写入数据
622 }
623
624
625 tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
626 Optr++;
627 if(attribs)Optr += BasePart2*256;
628 WriteCommand( CsrW ); // 光标定位指令
629 WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
630 WriteData( (Uchar)(Optr /256 ) );
631 WriteCommand( mWrite ); // ram写指令
632
633 for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
634 WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+1] ); // 写入数据
635 }
636
637 }
638
639 */
640 /*============================================================================
641 汉字写入子程序(文本方式)
C51 COMPILER V8.08 1335C51 04/26/2008 21:36:20 PAGE 12
642 在文本方式下显示汉字, 首先要建立汉字Cgram, 要定义汉字代码.
643 在文本方式下写汉字需要写入4 个代码以组成一个汉字
644 每8字节组成一个点阵Ascii小区,4个小区组合成一个汉字所以需要4个代码
645 ============================================================================*/
646 void PutCdotInAlpha( Uchar Ox, Uchar Oy, Uchar Cnumber) {
647 1
648 1 Uint tempPtr;
649 1 Uchar tempCount;
650 1
651 1 tempPtr = (Uint)Oy * paraP9 + Ox;
652 1 WriteCommand( CsrDirD ); // CSRDIR 代码(下移)
653 1
654 1 for(tempCount=0;tempCount<2;tempCount++) {
655 2
656 2
657 2 WriteCommand( CsrW ); // CSRW 代码,光标指针设置
658 2 WriteData( (Uchar)(tempPtr &0xff) ); // 设置光标地址CSR
659 2 WriteData( tempPtr /256 + BasePart3 );
660 2 WriteCommand( mWrite ); // 代码0x42,数据写入指令
661 2
662 2 WriteData( Cnumber++ ); // 写入汉字代码
663 2
664 2 WriteData( Cnumber++ ); // 写入汉字代码
665 2 tempPtr++; // 修正光标地址
666 2 }
667 1 }
668
669 /*======================== 清显示 32K RAM区(清屏)子程序 ======================*/
670
671 void LcmClear( void ) {
672 1
673 1 Uint i1=32768;
674 1
675 1 WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移
676 1 WriteCommand( CsrW ); // 光标Locate,定位
677 1 WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位
678 1 WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位
679 1 WriteCommand( mWrite ); // 数据写入指令,代码0x42
680 1 while(i1--) {
681 2
682 2 WriteData( 0x0 ); // 写入数据0
683 2 }
684 1 }
685
686 /*============================================================================
687 光标位定位,用于在1区图形方式下。
688 输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
689 y...垂直方向以行线定位的坐标,可以定位到点单位。
690 左上角约定坐标为( 0, 0 )
691
692 ============================================================================*/
693 void Locatexy(Uchar x,Uchar y, Uchar attribs) {
694 1 Uint temp;
695 1 temp = (Uint)y*paraP9+x;
696 1 if(attribs)temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
697 1 WriteCommand( CsrW ); // 光标Locate,定位
698 1 WriteData( (Uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
699 1 WriteData( (Uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
700 1 }
701
702 /*=============================================================================
703 ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
C51 COMPILER V8.08 1335C51 04/26/2008 21:36:20 PAGE 13
704 输入参数约定:
705 x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
706
707 *ptr...字符串指针,本函数所指的是flash字串
708 att....显示区标志,0...第一区;1...第二区
709 返回参数:输出字串长度,留意汉字一个算两个
710 其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
711 ==============================================================================*/
712 Uchar dprintf(Uchar x,Uchar y, char code *ptr, Uchar att)
713 {
714 1
715 1 Uchar c1,c2;
716 1 Uchar i,j,uLen,uRow,uCol,temp;
717 1 Uint k;
718 1 uRow = x;
719 1 uCol = y;
720 1 uLen=0;
721 1 WriteCommand( CsrDirD ); // 光标移动方向定义:自动下移
722 1 Locatexy(uRow,uCol,att); //起点定位
723 1 while ( (Uchar)ptr[uLen] >= 0x10 ){uLen++;}; //探测字串长度
724 1 i=0;
725 1 while(i<uLen)
726 1 {
727 2 c1 = ptr[i];
728 2 c2 = ptr[i+1];
729 2
730 2 //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
731 2 if(c1 <=128) // ASCII
732 2 {
733 3 if (c1 >= 0x10) {
734 4 WriteCommand( mWrite ); // 写数据(命令)
735 4 for(j=0;j<16;j++) WriteData( ASC_MSK[(c1-0x20)*16 +j ]);
736 4 }
737 3 uRow++; // 列数加1
738 3 }
739 2 else // 中文
740 2 {
741 3 for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++) // 查找定位
742 3 {
743 4 if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
744 4 break;
745 4 }
746 3 for(k=0;k<2;k++) // 分16行输出
747 3 {
748 4 Locatexy(uRow+k,uCol,att);
749 4 WriteCommand( mWrite ); // 写数据(命令)
750 4
751 4 for(temp=0;temp<16;temp++) WriteData( Cdotlib[j].Msk[temp*2 + k]);
752 4 }
753 3 uRow +=2; // 光标右移一大格
754 3 i++;
755 3 }
756 2 if(uRow >= 40) // 光标后移
757 2 {
758 3 uCol += 16; // Y坐标
759 3 uRow = 0; // X坐标
760 3 if( uCol >= 240 ) uCol = 0;
761 3 }
762 2
763 2 Locatexy(uRow,uCol,att);
764 2 i++;
765 2 }
C51 COMPILER V8.08 1335C51 04/26/2008 21:36:20 PAGE 14
766 1 return uLen; //返回字串长度,汉字按2字节计算
767 1 }
768
769
770 /*================================================
771 在定时器中断
772 ================================================*/
773 void timers0() interrupt 1 using 1 {
774 1
775 1 TH0 = 0x80;
776 1 TL0 = 0x00;
777 1 if (timer1)timer1--;
778 1 if (timer2)timer2--;
779 1 }
780
781
782 /*================================================
783 使用定时中断的长延时程序
784 ===============================================*/
785 void DelayMs(Uint tt) {
786 1 timer1=tt;
787 1 while(timer1);
788 1 }
789
790
791
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3059 ----
CONSTANT SIZE = 3863 ----
XDATA SIZE = 256 ----
PDATA SIZE = ---- ----
DATA SIZE = 4 55
IDATA SIZE = 12 ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 34 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -