7041|9

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

PIC单片机位操作 [复制链接]

PIC单片机如何像51单片机那样可以位操作?
void Lcd_Write_Com( int  DH)         //命令
{       
    LCD_RS=0;
LCD_CS =0;         
LCD_DataPortH=DH>>8;       
LCD_DataPortL=DH;       
LCD_WR=0;
LCD_WR=1;
LCD_CS =1;       
}
PIC单片机是用下面这8位代替的LCD_DataPortH
#define  LCD_DataPortH3        RC2
#define  LCD_DataPortH4        RD0
#define  LCD_DataPortH5        RD1
#define  LCD_DataPortH6        RD3
#define  LCD_DataPortH7        RC5
#define  LCD_DataPortH8        RC7
#define  LCD_DataPortH9        RD5

PIC单片机是用下面这8位代替的 LCD_DataPortL
#define  LCD_DataPortL1          RA1
#define  LCD_DataPortL2          RA2
#define  LCD_DataPortL3          RA3
#define  LCD_DataPortL4          RA4
#define  LCD_DataPortL5          RE0
#define  LCD_DataPortL6          RE2
#define  LCD_DataPortL7          RA6
#define  LCD_DataPortL8          RC1


程序应该如何写?DH为16位的数据。。。
此帖出自单片机论坛

最新回复

//给个实例,供参考 #include         //包含头文件 #define  PORTAIT(add, bit)  ((unsigned)(&add)*1+(bit))        //端口寄存器PORTA位定义 static bit  RA0  @PORTAIT(PORTA, 0);         //PORTA的RA0位(以下仅用该位) #define  PORTBIT(add, bit)  ((unsigned)(&add)*4+(bit))      //端口寄存器PORTB 位定义 static bit  RB0  @PORTBIT(PORTB, 0); static bit  RB2  @PORTBIT(PORTB, 2); static bit  RB4  @PORTBIT(PORTB, 4); static bit  RB6  @PORTBIT(PORTB, 6);         //PORTB 的RB0、RB2、RB4、RB6 位 void delay(unsigned long int K) ;        //带形式参数的延时函数(定义) main( )       //主函数 {   TRISA = 0x3F;   //设PORTA低位为输入   TRISB = 0x00;   //设PORTB 全为输出   INTCON = 0x00;  //关所有中断   PORTB = 0x00;   //RB 口送低电平   PORTB = 0xAA;   //RB 口外接LED间亮      while(RA0)      //RAO口外接开关按下?     { ;  //未按下,函数空操作     }    //按下,跳出循环   while(1)  //又一循环语句     {       PORTB=0x00;  //B 口清零       RB0 = 1;     //LED1 点亮       delay(20000) ; //延时1(时间1)       RB0 = 0;     //LED1 灭       RB2 = 1; //LED3 点亮       delay(30000) ; //延时2(时间2)       RB2 = 0;     //LED3 灭       RB4 = 1;     //LED5 点亮       delay(40000) ; //延时3(时间3)       RB4 = 0;     //LED5 灭       break; //用间断语句终止循环     }   RB6=1; //终止循环后,点亮LED7   delay(200000); //延时4(时间4) } void delay(K) //带形式参数的延时函数 unsigned long int K; //无符号长整型变量K {   unsigned long int d=K;     //形式参数K传送给d   while(--d) //循环条件d 减1     { ; //d 减到零退出循环     } } /* 说明: 上述程序中,关键字break、continue和return等组成的简单语句的使用是略有区别的。具体区别如下: 1. 间断语句break:程序运行到此就终止循环,跳出while(1)的循环体,执行该循环体紧接在后面的语句; 2. 继续语句continue:如果把该程序中的break语句换成继续语句continue,程序运行到此便立即 执行由while(1)开始功能的程序,即程序在该循环体内不断地运行,等效于不用continue语句; 3. return 语句:当把该程序中的break 换成return语句时,程序运行到此就会立即返回主程序运行。 */ [ 本帖最后由 xuyiyi 于 2013-11-21 11:08 编辑 ]  详情 回复 发表于 2013-11-21 11:03
点赞 关注
 

回复
举报

1078

帖子

2

TA的资源

五彩晶圆(中级)

沙发
 
你的数据口,引脚定义太乱,不连续,数据传送效率极其低下。
此帖出自单片机论坛
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

板凳
 
几乎只能一位一位传送~~~

LCD_DataPortH9 = (DH>>14) & 1;   //你的位地址编号是否正确???
LCD_DataPortH8 = (DH>>13) & 1;
LCD_DataPortH7 = (DH>>12) & 1;
LCD_DataPortH6 = (DH>>11) & 1;
LCD_DataPortH5 = (DH>>10) & 1;
LCD_DataPortH4 = (DH>>9) & 1;
LCD_DataPortH3 = (DH>>8) & 1;

LCD_DataPortL8 = (DH>>7) & 1;
LCD_DataPortL7 = (DH>>6) & 1;
LCD_DataPortL6 = (DH>>5) & 1;
LCD_DataPortL5 = (DH>>4) & 1;
LCD_DataPortL4 = (DH>>3) & 1;
LCD_DataPortL3 = (DH>>2) & 1;
LCD_DataPortL2 = (DH>>1) & 1;
LCD_DataPortL1 = (DH) & 1;

[ 本帖最后由 xuyiyi 于 2013-11-20 19:54 编辑 ]
此帖出自单片机论坛
 
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

4
 
代替这两句
LCD_DataPortH=DH>>8;        
LCD_DataPortL=DH;
此帖出自单片机论坛

点评

#define LCD_DataPortL1 RA1 低0 #define LCD_DataPortL2 RA2 #define LCD_DataPortL3 RA3 #define LCD_DataPortL4 RA4 #define LCD_DataPortL5 RE0 #define LCD_DataPortL6  详情 回复 发表于 2013-11-21 09:51
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼xuyiyi 的帖子

#define  LCD_DataPortL1                         RA1     低0
#define  LCD_DataPortL2                         RA2
#define  LCD_DataPortL3                         RA3
#define  LCD_DataPortL4                         RA4
#define  LCD_DataPortL5                         RE0
#define  LCD_DataPortL6                         RE2
#define  LCD_DataPortL7                         RA6
#define  LCD_DataPortL8                         RC1          低8

#define  LCD_DataPortH2                  RC0         高0
#define  LCD_DataPortH3                  RC2
#define  LCD_DataPortH4                  RD0
#define  LCD_DataPortH5                  RD1
#define  LCD_DataPortH6                  RD3
#define  LCD_DataPortH7                  RC5
#define  LCD_DataPortH8                  RC7
#define  LCD_DataPortH9                  RD5     高8




void Lcd_Write_Com( int  DH)         //命令
{       
    LCD_RS=0;
        LCD_CS =0;                


LCD_DataPortH9 =(DH>>0) & 1 ;   //
LCD_DataPortH8 =(DH>>1) & 1;
LCD_DataPortH7 =(DH>>2) & 1 ;
LCD_DataPortH6 =(DH>>3) & 1;
LCD_DataPortH5 =(DH>>4) & 1 ;
LCD_DataPortH4 =(DH>>5) & 1 ;
LCD_DataPortH3 =(DH>>6) & 1 ;
LCD_DataPortH2 =(DH>>7) & 1;

LCD_DataPortL8 = (DH>>8) & 1;
LCD_DataPortL7 = (DH>>9) & 1 ;
LCD_DataPortL6 = (DH>>10) & 1;
LCD_DataPortL5 = (DH>>11) & 1;
LCD_DataPortL4 = (DH>>12) & 1;
LCD_DataPortL3 = (DH>>13) & 1;
LCD_DataPortL2 = (DH>>14) & 1;
LCD_DataPortL1 = (DH>>15) & 1;

        LCD_WR=0;
        LCD_WR=1;
        LCD_CS =1;       
}
void lcd_write_color(char hh,char ll)        //发送颜色数据为提高速度高8位低8位分别传递       
{


    LCD_RS=1;
        LCD_CS =0;
LCD_DataPortH9=(hh>>0)&1;
LCD_DataPortH8=(hh>>1)&1;
LCD_DataPortH7=(hh>>2)&1;
LCD_DataPortH6=(hh>>3)&1;
LCD_DataPortH5=(hh>>4)&1;
LCD_DataPortH4=(hh>>5)&1;
LCD_DataPortH3=(hh>>6)&1;
LCD_DataPortH2=(hh>>7)&1;
               
LCD_DataPortL8=(ll>>0)&1;
LCD_DataPortL7=(ll>>1)&1;
LCD_DataPortL6=(ll>>2)&1;
LCD_DataPortL5=(ll>>3)&1;
LCD_DataPortL4=(ll>>4)&1;
LCD_DataPortL3=(ll>>5)&1;
LCD_DataPortL2=(ll>>6)&1;
LCD_DataPortL1=(ll>>7)&1;                                       
  LCD_WR=0;       
        LCD_WR=1;
        LCD_CS =1;       
}

void Lcd_Write_Data(int DH)        //数据       
{
    LCD_RS=1;
        LCD_CS =0;       

LCD_DataPortH9 =(DH>>0) & 1 ;   
LCD_DataPortH8 =(DH>>1) & 1;
LCD_DataPortH7 =(DH>>2) & 1 ;
LCD_DataPortH6 =(DH>>3) & 1;
LCD_DataPortH5 =(DH>>4) & 1 ;
LCD_DataPortH4 =(DH>>5) & 1 ;
LCD_DataPortH3 =(DH>>6) & 1 ;
LCD_DataPortH2 =(DH>>7) & 1;

LCD_DataPortL8 = (DH>>8) & 1;
LCD_DataPortL7 = (DH>>9) & 1 ;
LCD_DataPortL6 = (DH>>10) & 1;
LCD_DataPortL5 = (DH>>11) & 1;
LCD_DataPortL4 = (DH>>12) & 1;
LCD_DataPortL3 = (DH>>13) & 1;
LCD_DataPortL2 = (DH>>14) & 1;
LCD_DataPortL1 = (DH>>15) & 1;
LCD_WR=0;
        LCD_WR=1;
        LCD_CS =1;       
}


void Lcd_Write_Com_Data( int com1, int dat1)        //命令数据一起
{
   Lcd_Write_Com(com1);
   Lcd_Write_Data(dat1);
}


我按这个方法试过了,还是不行
此帖出自单片机论坛
 
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

6
 
自已仔细检查!!!

(DH>>0) & 1   是将最低bit位(bit.0)取出,(DH>>1) & 1  是将次低bit位(bit.1)取出,依次类推。。。

你是怎样赋值的呢???

LCD_DataPortH9 =(DH>>0) & 1 ;   //最最低位(bit.0)赋值于最最高位(bit.15) ???
此帖出自单片机论坛
 
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

7
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

8
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

1078

帖子

2

TA的资源

五彩晶圆(中级)

9
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

10
 
闂備礁鎼悮顐﹀磿閸愯鑰块柛娑欐綑鐎氬銇勯幒鍡椾壕缂備焦顨嗛敃銏犵暦濡ゅ懎惟闁宠桨绀佹慨銈夋煟閻橀亶妾烽柛鏂跨箻椤㈡瑩骞嬮敂鑺ユ珫閻庡厜鍋撻柛鎰劤濞堬拷闂備浇鐨崱鈺佹缂傚倸绋勯幏锟�闂備胶鎳撻悺銊╂偋閻愬搫鐒垫い鎺戯攻鐎氾拷婵犵數鍋涢ˇ顓㈠礉瀹€鍕埞闁跨噦鎷�
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表